![]() |
Класс для работы с сокетами на С++
Вложений: 2
Написал недавно удобный класс Socket для работы с сокетами.
Класс содержит следующие методы: Socket(bool create=1, int type=SOCK_STREAM, int protocol=IPPROTO_TCP) Конструктор класса Socket. Флаг create указывает на необходимость создания сокета в конструкторе. По умолчанию принимается тип SOCK_STREAM и протокол IPPROTO_TCP (TCP/IP) Socket(SOCKET) создание объекта на основе уже созданного сокета Socket(Socket&) конструктор копии ~Socket() деструктор int create(int type=SOCK_STREAM, int protocol=IPPROTO_TCP) создает сокет указанного типа и протокола int set_buffer_size(int size) установка размера входного буфера. возвращает старое значение int get_buffer_size() получение размера входного буфера bool set_terminate_flag(bool value) установка флага, при котором будет записываться 0 в конец буфера при получении данных. возвращает старое значение bool get_terminate_flag() получение флага записи 0 int get_last_length() получение длины последнего полученного блока данных static char* getlasterror() возвратить текстовое описание ошибки. утечки памяти не происходит, т.к. место зарезервировано в сегменте данных int bind(int port, int addr=INADDR_ANY) биндит сокет к порту и указанному адресу. эта и все остальные сокетные функции возвращает -1 при ошибке и 0, если все нормально int connect(char* host_name, int port) соединяется с указанном хостом и портом. Можно передать доменное имя int connect_to(sockaddr_in* sa) соединяется согласно параметрам, указанным в заполненной структуре SOCKADDR_IN int close() закрывает сокет int listen(int backlog=5) переводит сокет в прослушивающий режим Socket* accept(sockaddr_in* from=0) ждет входящего соединения. Можно передать адрес sockaddr_in, куда будет записан адрес удаленного компьютера. Возвращает новый объект Socket, который нужно будет удалить оператором delete. char* recv(char* buffer, int buflen=0) получает данные из сокета. Если передать 0 вместо длины буфера, будет использоваться дефолтное значение unsigned char* recv(unsigned char* buffer, int buflen=0) перегруженный аналог предыдущей функции для типа unsigned char* char* recv() получение данных с автовыделением памяти. Она должна будет удалена вызовом delete. int send(char* buffer, int buflen=0) и int send(unsigned char* buffer, int buflen=0) отправка данных в сокет. Если указать длину 0, то длина будет вычислена с помощью strlen() (до первого нулевого байта) Резолвинг доменных имен: static char* nslookup(char* host_name) и static DWORD nslookup_raw(char* host_name) возвращают IP-адрес, соответствующий домену, соответственно в строковом и числовом форматах. Поддержка потокового ввода-вывода для строк Socket& operator<<(char* string) и Socket& operator>>(char* buffer) Пример клиентской программы: Код:
Socket sock;Код:
Socket serv;Код:
class Socks: public SocketСкачать: socket.h (2 Kb) socket.cpp (6 Kb) |
_Great_ - а на паскаль переведешь?
|
На паскальные классы?
Можно попробовать |
слушай ток я чет не пойму get_buffer_size() это "получение размера входного буфера" тобеш ответ сервера?? почему тогла всегда выдает 1024 !
и recv() тоже берет ток 1024 символа, а не весь ответ! или я чет не разобрался.. |
Если recv() не передать длину буфера или юзать конструкцию sock>>buffer, то из сокета прочтется количество байт, равное дефолтной длине буфера (по умолчанию 1024). Это значение меняется функцией set_buffer_size().
А получение реального размера - get_last_length(). пример: Код:
char buffer[512]; |
НУ эт я уже понял! а есле я не знаю длину ответа?? тогда как??
|
В смысле? :)
Код:
char buf[512]; // создаем буфер |
/me думает: "а если сам перепишу, сколько багов будет??!"
;) |
Цитата:
|
возник вопрос, как определит наличие работающего сетевого подключения к интернету? или открыть сокет и попытаться что-то прочитать и есть самый простой вариант? как отловить момент когда юзер подключиться?
Код:
// file: svchost.cppда и еще если Socket sock; вытащить из цикла, то почему-то после первого обращения к серверу, в следующие шаги цикла ничего не приходит(как будто и не пытаеться соединиться)? почему? первый раз что-то под сеть пишу на CPP... |
| Время: 14:56 |