На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Хелп ми!
      Люди!!! Стоя на коленях прошу вас выслать мне пример TCP сервера который в момент общения с клиентом может делать хоть что-нибудь еще, а не зацикливаться... А-А-А-А!!!
        ты очень вовремя... 10 минут назад я закончил последние тесты моего TCP клиент-сервера....
        напиши куда выслать...
          И мне тоже скинь плиз: pigmey@di.net.ua
            [\move] - вообще-то слэш нужно ставить в другую сторону :)

            А что тебе не нравится? у меня на винте почти 1 гектар разных сырцов - ведь может пригодиться! погляжу сырцы Muranа, может интересное что-нить почерну, а нет - так Del на что?
              [move] - вообще-то слэш нужно ставить в другую сторону :)[/move]


              Я уже понял  ;D

              Цитата Alfa, 26.01.03, 12:50:36
              А что тебе не нравится? у меня на винте почти 1 гектар разных сырцов - ведь может пригодиться! погляжу сырцы Muranа, может интересное что-нить почерну, а нет - так Del на что?


              Просто забавно...  ;D
              А сырцов и у меня много!
              Сообщение отредактировано: umpire -
                Если оно более менее без MFC сокетов, то и мне плз:)

                Muran тебе уже пора себе на страничку выкладывать и линк давать:)
                  Во я какой прикольный вопрос задал!!!  :)
                  Только чето Muran с массовой отправкой писем не торопится  :(
                    Цитата Ламка, 26.01.03, 16:29:15
                    Во я какой прикольный вопрос задал!!!  :)
                    Только чето Muran с массовой отправкой писем не торопится  :(

                    А он посмотрел на это все и подумал ( на... нужно )!  ;D
                      ExpandedWrap disabled
                        <br>::WaitForSingleObject(hMuran,INFINITE);<br>


                      :o

                      Блин, народ, сорри, не ожидал, что тема супер порпулярна...
                      у меня накрылась почта... но главная проблема в том, что я все переделал...
                      сеёчас в очередной раз прогнал все тесты... вроде опять работает... через пару минут все выложу на
                      www.muransoft.narod.ru/tcp_debug.rar   Rar третьей версии.

                      Это полнейший дебаг... всякие сообщений вываливаются.. иногда падает...
                      Сегодня скорее всего доделаю...

                      Сделано вообще без MFC и предполагается, что я это все засуну в dll и будую
                      юзать COM объект от туда... во как.

                        усе.. выложил последнюю рабочую версию.. конечно многое сделано по русски,
                        но времени особо не было.. к тому же это дебаг... все заинтересованные могут спрашивать что и как.. т.к. комментариев нету... плка не сделал...
                          Чудесненько!  :D Ща буду telnetom тестить...
                            НАРОД!!! ВСЕМ-ВСЕМ-ВСЕМ!!!

                            Я надыбал статью :
                            "Самоучитель игры на WINSOCK"
                            Крис Касперски
                            kpnc@aport.ru


                            Я специально для вас всех привел ее в божеский вид:


                            ExpandedWrap disabled
                              #include <stdio.h> <br>#include <winsock2.h> // Wincosk2.h должен быть раньше windows! <br>#include <windows.h> <br>#define MY_PORT 666 // Порт, который слушает сервер <br><br>// макрос для печати количества активных пользователей <br>#define PRINTNUSERS if (nclients) printf("\%d user on-line\n",nclients);else printf("No User on line\n"); <br><br>// прототип функции, обслуживающий подключившихся пользователей <br>DWORD WINAPI SexToClient(LPVOID client_socket); <br><br>// глобальная переменная – количество активных пользователей <br>int nclients = 0; <br>int main(int argc, char* argv[]) <br>{ <br>char buff[1024]; // Буфер для различных нужд <br>printf("TCP SERVER DEMO\n"); <br>// Шаг 1 - Инициализация Библиотеки Сокетов <br>// Т.к. возвращенная функцией информация не используется <br>// ей передается указатель на рабочий буфер, преобразуемый к указателю <br>// на структуру WSADATA. <br>// Такой прием позволяет сэкономить одну переменную, однако, буфер <br>// должен быть не менее полкилобайта размером (структура WSADATA <br>// занимает 400 байт) <br>if (WSAStartup(0x0202,(WSADATA *) &buff[0])) <br>{ <br>// Ошибка! <br>printf("Error WSAStartup \%d\n",WSAGetLastError()); <br>return -1; <br>} <br><br>// Шаг 2 - создание сокета <br>SOCKET mysocket; <br>// AF_INET - сокет Интернета <br>// SOCK_STREAM - потоковый сокет (с установкой соединения) <br>// 0 - по умолчанию выбирается TCP протокол <br>if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0) <br>{ <br>// Ошибка! <br>printf("Error socket \%d\n",WSAGetLastError()); <br>WSACleanup(); // Деиницилизация библиотеки Winsock <br>return -1; <br>} <br><br>// Шаг 3 связывание сокета с локальным адресом <br>sockaddr_in local_addr; <br>local_addr.sin_family=AF_INET; <br>local_addr.sin_port=htons(MY_PORT); // не забываем о сетевом порядке!!! <br>local_addr.sin_addr.s_addr=0; // сервер принимает подключения <br>// на все свои IP-адреса <br><br>// вызываем bind для связывания <br>if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr))) <br>{ <br>// Ошибка <br>printf("Error bind \%d\n",WSAGetLastError()); <br>closesocket(mysocket); // закрываем сокет! <br>WSACleanup(); <br>return -1; <br>} <br><br>// Шаг 4 ожидание подключений <br>// размер очереди – 0x100 <br>if (listen(mysocket, 0x100)) <br>{ <br>// Ошибка <br>printf("Error listen \%d\n",WSAGetLastError()); <br>closesocket(mysocket); <br>WSACleanup(); <br>return -1; <br>} <br><br>printf("Waiting for connections... #8230;\n"); <br><br>// Шаг 5 извлекаем сообщение из очереди <br>SOCKET client_socket; // сокет для клиента <br>sockaddr_in client_addr; // адрес клиента (заполняется системой) <br><br>// функции accept необходимо передать размер структуры <br>int client_addr_size=sizeof(client_addr); <br><br>// цикл извлечения запросов на подключение из очереди <br>while((client_socket=accept(mysocket, (sockaddr *) &client_addr, &client_addr_size))) <br>{ <br>nclients++; // увеличиваем счетчик подключившихся клиентов <br>// пытаемся получить имя хоста <br>HOSTENT *hst; <br>hst=gethostbyaddr((char *) &client_addr.sin_addr.s_addr,4,AF_INET); <br><br>// вывод сведений о клиенте <br>printf("+\%s [\%s] new connect!\n",(hst)?hst->h_name:"",inet_ntoa(client_addr.sin_addr)); <br>PRINTNUSERS <br>// Вызов нового потока для обслужвания клиента <br>// Да, для этого рекомендуется использовать _beginthreadex <br>// но, поскольку никаких вызов функций стандартной Си библиотеки <br>// поток не делает, можно обойтись и CreateThread <br>DWORD thID; <br>CreateThread(NULL,NULL,SexToClient,&client_socket,NULL,&thID); <br>} <br>return 0; <br>} <br><br><br>// Эта функция создается в отдельном потоке <br>// и обсуживает очередного подключившегося клиента независимо от остальных <br>DWORD WINAPI SexToClient(LPVOID client_socket) <br>{ <br>SOCKET my_sock; <br>my_sock=((SOCKET *) client_socket)[0]; <br>char buff[20*1024]; <br>#define sHELLO "Hello, Sailor\r\n" <br><br>// отправляем клиенту приветствие <br>send(my_sock,sHELLO,sizeof(sHELLO),0); <br><br>// цикл эхо-сервера: прием строки от клиента и возвращение ее клиенту <br>while(int bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0) && bytes_recv !=SOCKET_ERROR) <br>send(my_sock,&buff[0],bytes_recv,0); <br><br>// если мы здесь, то произошел выход из цикла по причине <br>// возращения функцией recv ошибки – соединение с клиентом разорвано <br>nclients--; // уменьшаем счетчик активных клиентов <br>printf("-disconnect\n"); PRINTNUSERS <br><br>// закрываем сокет <br>closesocket(my_sock); <br>return 0; <br>} <br><br><br><br>====== извините, но клиент приведёте в божеский вид сами ======<br><br><br>// Пример простого TCP клиента <br>#include <stdio.h> <br>#include <string.h> <br>#include <winsock2.h> <br>#include <windows.h> <br><br>#define PORT 666 <br>#define SERVERADDR "127.0.0.1" <br><br>int main(int argc, char* argv[]) <br>{ <br>char buff[1024]; <br>printf("TCP DEMO CLIENT\n"); <br><br>// Шаг 1 - инициализация библиотеки Winsock <br>if (WSAStartup(0x202,(WSADATA *)&buff[0])) <br>{ <br>printf("WSAStart error \%d\n",WSAGetLastError()); <br>return -1; <br>} <br><br>// Шаг 2 - создание сокета <br>SOCKET my_sock; <br>my_sock=socket(AF_INET,SOCK_STREAM,0); <br>if (my_sock<0) <br>{ <br>printf("Socket() error \%d\n",WSAGetLastError()); <br>return -1; <br>} <br><br>// Шаг 3 - установка соединения <br><br>// заполнение структуры sockaddr_in – указание адреса и порта сервера <br>sockaddr_in dest_addr; <br>dest_addr.sin_family=AF_INET; <br>dest_addr.sin_port=htons(PORT); <br>HOSTENT *hst; <br><br>// преобразование IP адреса из символьного в сетевой формат <br>if (inet_addr(SERVERADDR)!=INADDR_NONE) <br>dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR); <br>else <br>// попытка получить IP адрес по доменному имени сервера <br>if (hst=gethostbyname(SERVERADDR)) <br>// hst->h_addr_list содержит не массив адресов, а массив указателей на адреса <br>((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long <br>**)hst->h_addr_list)[0][0]; <br>else <br>{ <br>printf("Invalid address \%s\n",SERVERADDR); <br>closesocket(my_sock); <br>WSACleanup(); <br>return -1; <br>} <br><br>// адрес сервера получен – пытаемся установить соединение <br>if (connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) <br>{ <br>printf("Connect error \%d\n",WSAGetLastError()); <br>return -1; <br>} <br><br>printf("Соединение с \%s успешно установлено\n\ Type quit for quit\n\n",SERVERADDR); <br><br>// Шаг 4 - чтение и передача сообщений <br>int nsize; <br>while((nsize=recv(my_sock,&buff[0],sizeof(buff)-1,0))!=SOCKET_ERROR) <br>{ <br>// ставим завершающий ноль в конце строки <br>buff[nsize]=0; <br><br>// выводим на экран <br>printf("S=>C:\%s",buff); <br><br>// читаем пользовательский ввод с клавиатуры <br>printf("S<=C:"); fgets(&buff[0],sizeof(buff)-1,stdin); <br><br>// проверка на "quit" <br>if (!strcmp(&buff[0],"quit\n")) <br>{ <br>// Корректный выход <br>printf("Exit..."); <br>closesocket(my_sock); <br>WSACleanup(); <br>return 0; <br>} <br><br>// передаем строку клиента серверу <br>send(my_sock,&buff[0],nsize,0); <br>} <br><br>printf("Recv error \%d\n",WSAGetLastError()); <br>closesocket(my_sock); <br>WSACleanup(); <br>return -1; <br>}


                            ПОДКЛЮЧАЕМ ws2_32.lib И ПРОГРАММЫ ГОТОВЫ К РАБОТЕ

                            PS 2 Moderator: Плз не удаляй это сообщение, оно может очень многим понадобиться...


                            Не боися, модеры плохого почти не делают ;D (added by SUnteXx)
                            Сообщение отредактировано: SUnteXx -
                              Цитата

                              ну он то ладно!!!  


                              Я что-то недопонял, это ты к чему ?  ::):)
                                Цитата Pigmey, 27.01.03, 01:37:35


                                Я что-то недопонял, это ты к чему ?  ::):)


                                ;D ;D ;D
                                Я сказал Ну он то ладно для нижнего, а не для верхнего...!  ;)
                                  ;D
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0365 ]   [ 16 queries used ]   [ Generated: 12.12.24, 22:48 GMT ]