Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
как в VS2005 подключить socket. делал все по манам и ничего не получается. а мне очень надо.... я уже не знаю как быть!!помогите плз...
|
Сообщ.
#2
,
|
|
|
Еще раз по порядку, что именно и куда подключить... Какой тип проекта, с эмэфцэ или нет и так далее, с подробностями.
|
Сообщ.
#3
,
|
|
|
вообщем я хочу научиться работатьь с сокетами. вообщем у меня задание написать чат. хочу использовать UDP протокол. пытался разобраться по этому мануалу man, делаю все как написано, разорался в принципе работы, но ничего не получается. в примере я так понимаю используется VC7 или ниже, в VC8 не раотает.воть!
|
Сообщ.
#4
,
|
|
|
Сторона клиента.
Первое действие, которое необходимо совершить клиенту, это инициализировать сервис Winsock. Это можно выполнить при помощи функции: WSADATA WSAData; WSAStartup (MAKEWORD(1,1), &WSAData); Если интерфейс подключен, следующим шагом является создание сокета, для чего необходимо выполнить функцию socket: SOCKET socket( int af, int type, int protokol ); где af – идентификатор спецификации; type – тип нового сокета, который может принимать два значения – SOCK_STREAM и SOCK_DGRAM, определяя спецификация какого из протоколов (TCP или UDP) будет использоваться; protokol – задает тип протокола. Результатом функции является созданный объект типа SOCKET. Следующий пример демонстрирует оформление вызова данной функции: SOCKET MySock = INVALID_SOCKET; // Socket bound to the server MySock = socket (AF_INET, SOCK_STREAM, 0); Созданный сокет - клиент должен установить связь с сокетом - сервером. Для этого существует специальная функция connect: int connect ( SOCKET s, const struct sockaddr * name, int namelen ); где s – несвязанный ранее сокет, name - имя сокета, к которому осуществляется подключение; namelen - размер имени сокета во втором параметре функции; Для созданного ранее сокета вызов функции выглядит следующим образом: SOCKADDR_IN sAdr; pHost=gethostbyname("localhost"); memcpy ((char FAR *)&(sAdr.sin_addr),pHost->h_addr,pHost->h_length); sAdr.sin_port = htons(1050); sAdr.sin_family = AF_INET; connect((unsigned int)MySock, (PSOCKADDR) &sAdr, sizeof (sAdr)); Посылать данные: int send ( SOCKET s, const char * buf, int len, int flags ); Принимать данные: int recv (SOCKET s,char * buf, intlen, int flags); где s – сокет, подключенный к серверу; buf - буфер обмена данными (в случае первой функции данные из буфера передаются сокету, во втором – из сокета копируются в буфер); len - размер буфера; flags - всегда установлен в 0. Сторона сервера. Первые шаги программы - сервера аналогичны клиенту. Проходит активизация интерфейса при помощи функции WSAStartup, после чего создается "сокет – сервер" (функция socket). Его назначение – прослушивать сеть в поисках клиентов, которые захотят общаться с сервером. "Сокет-сервер" ассоциируется с конкретным адресом, для чего используется функция bind: SOCKADDR_IN sAdr; PHOSTENT pHost; pHost=gethostbyname("localhost"); memcpy ((char FAR *)&(sAdr.sin_addr),pHost->h_addr,pHost->h_length); sAdr.sin_port = htons(1050); sAdr.sin_family = AF_INET; bind (ServerSock,(PSOCKADDR) &sAdr,sizeof(sAdr); После выполнения этого шага, сокет необходимо перевести в режим "прослушивания". Находясь в данном режиме, сокет перехватывает все обращения к нему (для чего и был задан адрес и номер порта) от других сокетов - клиентов, - которые находятся на этом же либо другом компьютере и выполняют функцию connect. Перевод в режим прослушивания осуществляется функцией listen. int listen( SOCKET s, int backlog); На сокете в режиме прослушивания образуется очередь запросов от сокетов –клиентов. Для того, чтобы установить связь, необходимо в программе – сервере создать еще один сокет для установления связи с одним из клиентов. Данный сокет создается на основе запроса, хранимого в "сокете - сервере". Для этих целей служит функция accept. SOCKADDR cAdr; int size1=sizeof(cAdr); SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen); где s – сокет в режиме прослушивания; addr и addrlen- являются выходными параметрами функции, в которые соответственно записывается адрес и длина адреса сокета, который послал запрос на соединение. на этой строчке компилятор останавливается и ждет пока к нему не подконнектиться клиент, так что помещай в отдельный поток после завершения - int closesocket( SOCKET s); удачи... |
Сообщ.
#5
,
|
|
|
большое при большое спасио, осталось получше в этом разобраться! а как поступить в примере не клиент-сервер???
Добавлено nrav еще вопрос, а какие при этом библиотеки подключать надо??? |
Сообщ.
#6
,
|
|
|
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib") для любой проги с сокетами! |
Сообщ.
#7
,
|
|
|
о... как раз с lib у меня бока были... сенк!
|
Сообщ.
#8
,
|
|
|
[quote=darovec[/quote]
Если писать чат, то удобнее делать все таки как много клиентов -> сервер. Тогда можно использовать TCP. Кроме того, на сервере можно хранить лог чата, если это нужно, да и вообще подвесить к этому делу можно море разных полезных приблуд. |
Сообщ.
#9
,
|
|
|
блин... чет у меня ничего не получается) походу повышеная криворукость
|
Сообщ.
#10
,
|
|
|
А вот сдесь есть классный пример и практически готовый клиент сервер на mfc
http://sources.ru/cpp/cpp_tcpclser.shtml Может поможет разобраться??? |
Сообщ.
#11
,
|
|
|
сенки... щас почитаю!!!!
|