На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > WinSocket , не могу подключить
      как в VS2005 подключить socket. делал все по манам и ничего не получается. а мне очень надо.... я уже не знаю как быть!!помогите плз...
        Еще раз по порядку, что именно и куда подключить... Какой тип проекта, с эмэфцэ или нет и так далее, с подробностями.
          вообщем я хочу научиться работатьь с сокетами. вообщем у меня задание написать чат. хочу использовать UDP протокол. пытался разобраться по этому мануалу man, делаю все как написано, разорался в принципе работы, но ничего не получается. в примере я так понимаю используется VC7 или ниже, в VC8 не раотает.воть!
            Сторона клиента.
            Первое действие, которое необходимо совершить клиенту, это инициализировать сервис 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);


            удачи...
              большое при большое спасио, осталось получше в этом разобраться! а как поступить в примере не клиент-сервер???

              Добавлено
              nrav еще вопрос, а какие при этом библиотеки подключать надо???
                #include <winsock2.h>
                #pragma comment(lib,"WS2_32.lib")

                для любой проги с сокетами!
                  о... как раз с lib у меня бока были... сенк!
                    [quote=darovec[/quote]
                    Если писать чат, то удобнее делать все таки как много клиентов -> сервер. Тогда можно использовать TCP. Кроме того, на сервере можно хранить лог чата, если это нужно, да и вообще подвесить к этому делу можно море разных полезных приблуд.
                      блин... чет у меня ничего не получается) походу повышеная криворукость :D
                        А вот сдесь есть классный пример и практически готовый клиент сервер на mfc

                        http://sources.ru/cpp/cpp_tcpclser.shtml

                        Может поможет разобраться???
                          сенки... щас почитаю!!!!
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0299 ]   [ 16 queries used ]   [ Generated: 10.12.24, 11:10 GMT ]