TCP передача данных

Тема в разделе "LANGS.C", создана пользователем hamper, 13 май 2008.

  1. hamper

    hamper Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    37
    Адрес:
    Russia
    Имеется проблема с передачей (send) данных по 1-му байту.

    Приведённый код проверял на двух машинах: Win98 и WinXP(SP2).
    В кач-ве клиента использовал telnet. Если сервер запущен на Win98 или и клиент, и сервер на одной машине - программа работает (сервер передаёт 10000 символов первому подключившемуся клиенту, разрывает связь и завершает работу).
    Если сервер запущен на WinXP, а клиент на другой машине, то сервер зависает после передачи 8193 байт.
    Также зависают все другие программы на машине WinXP, которые пытаются работать с сетью (до перезагрузки).
    Клиент получает от сервера только 1 символ.

    В чём состоит ошибка?
    Код (Text):
    1. #include <winsock2.h>
    2.  
    3. int main(int argc, char *argv[])
    4. {
    5.     SOCKET server;
    6.     SOCKET s;
    7.     sockaddr_in addr;
    8.     ZeroMemory(&addr, sizeof addr);
    9.     WSAData WSAd;
    10.     int err;
    11.  
    12.     err=WSAStartup(MAKEWORD(1, 1), &WSAd);
    13.  
    14.     server=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    15.  
    16.     addr.sin_family=AF_INET;
    17.     addr.sin_addr.S_un.S_addr=INADDR_ANY;
    18.     addr.sin_port=htons(8081);
    19.     err=bind(server, (sockaddr*)&addr, sizeof addr);
    20.     err=listen(server, SOMAXCONN);
    21.  
    22.     s=accept(server, 0, 0);
    23.     char ch='A';
    24.     for(int i=0; i<10000; i++)
    25.         send(s, &ch, 1, 0);//передаёт 8193 байта, после чего зависает
    26.                             //клиент получает 1 байт
    27.  
    28.     shutdown(s, SD_BOTH);
    29.     closesocket(s);
    30.     closesocket(server);
    31.     err=WSACleanup();
    32.  
    33.     return 0;
    34. }