![]() |
Класс для работы с сокетами на С++
Вложений: 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... |
Цитата:
|
Цитата:
а так в цикле на каждой итерации каждый раз вызывается конструктор класса. когда вытащишь - конструктор вызывается один раз перед циклом. выход из ситуации - вытащить из цикла Socket sock и пихнуть в цикл перед connect вызов socket.create() для создания нового сокета. v@no, вот и перепеши на дельфи, если тебе не в лом :) |
Цитата:
|
Цитата:
|
Цитата:
|
От Флёнова? фуууууууууууууууууууууу.=\\ \\\\\\\\
Я читал его книжки, пару штук. Я не знаю, чем он накуривался, но там таакой бред... Помнится, мы с тохой и с бр читали его книжку какую-то в магазине и ржали ) Кстати, че вас на дельфи понесло) Я писал для С++. |
_Great_
неплохо неплохо понравился мне твой клас. Анекоторые книжки Флёнова могут помочь новичкам. но их лучше параллельно читать с какой нибудь другой книженцией т.к там действительно бывает бред. |
Цитата:
такое увидишь только там :) |
А можно куда-нибудь еще раз пожалуйста перезалить фаилы socket.h и socket.cpp или выслать на мыло mister.zavulon@kpost.ru. Зарание благодарен.
|
Цитата:
Видел я его книгу по пхп - жуть =\ Great: Да вы, батенька, археолог оО |
Обновил ссылки + приаттачил к посту
|
грейт спс за такой хороший класс! пойду напишу на нём сплойт)
|
Я еще там слегка полиморфизм прикрутил, но сорсы залил старые, перезаливать влом.. Чтобы можно было одинаково юзать функции и класса Socks и класса Socket.. парочка чисто виртуальных функций и все такое... вообщем надо тот сам дореализует, если ооочень надо будет - это можно будет найти в исходниках AntichatWebTool, релиз которой через некоторое время состоится.
|
Цитата:
не говоря уже про то, что код бонально не удовлетворяет базовой гарантии. з.ы и вообще юзай asio.sourceforge.net |
Ну.. многопоточность была не оч нужна. Коды ошибок, исключения - а разница то?
Цитата:
|
Нет, ну а мало ли...
Впрочем, конечно, под Винду такие вещи актуальнее на С или на C# .NET, а то, что сотворил Грейт (кстати клевая штука именно в плане кода) - смотрелось бы идеологическо гораздо более верно под Никсы. P.S. И, кстати да, это явление относится именно к велосипеду, который изобретать не стоит - ибо в boost.asio все уже украдено до нас. |
выпадает ошибка, хотя Preprocessor Definitions: WIN32;_DEBUG;_CONSOLE;_UNICODE;UNICODE
или проблема не в этом? socket.cpp(278) : error C2664: 'FormatMessageW' : cannot convert parameter 5 from 'char [256]' to 'LPWSTR' |
то _Great_ видела ты написал что еще модифицировал, не мог бы выложить ? или скинь пожалуйста на taria88@mail.ru
|
подскажите а на net есть переведенный класс?
|
Цитата:
|
kusanagi
Эээ в дотнете же встроенные есть. |
Цитата:
|
Цитата:
http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.aspx |
| Время: 02:54 |