Не возвращается accept(), хотя syn-пакеты приходят

Тема в разделе "WASM.NETWORKS", создана пользователем Son of God, 23 ноя 2005.

  1. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Вот код:
    Код (Text):
    1. VOID Receive2()
    2. {
    3.     sockaddr_in service;
    4.     sockaddr remoteAddr;
    5.     UINT remoteAddrLen;
    6.     UCHAR* recvbuf = new UCHAR[65536];
    7.     UINT bytesSent;
    8.     UINT bytesRecv;
    9.  
    10.     // создаем сокет для входящих соединений
    11.     sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    12.     if (sock2 == INVALID_SOCKET)
    13.     {
    14.         cout << "Socket() failed when creating the socket for incoming connections." << endl;
    15.         delete[] recvbuf;
    16.     }
    17. //////////////////////////////////////////////////////////////////////  //////////////////////
    18. #ifdef _DEBUG
    19.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0);
    20.     sprintf(DebugBuffer, "cui-client: Receive2: bind: WSAGetLastError() returned %s", GetLastErrorBuffer);
    21.     OutputDebugString(DebugBuffer);
    22. #endif
    23. //////////////////////////////////////////////////////////////////////  //////////////////////
    24.     // binding the socket
    25.     service.sin_family = AF_INET;
    26.     service.sin_addr.s_addr = ADDR_ANY;
    27.     service.sin_port = tcpPort;
    28.  
    29.     if (bind(sock2, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR)
    30.     {
    31.         cout << "Bind() failed." << endl;
    32.         shutdown(sock2, SD_BOTH);
    33.         closesocket(sock2);
    34.         delete[] recvbuf;
    35.     }
    36. //////////////////////////////////////////////////////////////////////  //////////////////////
    37. #ifdef _DEBUG
    38.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0);
    39.     sprintf(DebugBuffer, "cui-client: bind: WSAGetLastError() returned %s", GetLastErrorBuffer);
    40.     OutputDebugString(DebugBuffer);
    41. #endif
    42. //////////////////////////////////////////////////////////////////////  //////////////////////
    43.     // listening on the socket
    44.     if (listen(sock2, SOMAXCONN) == SOCKET_ERROR)
    45.     {
    46.         cout << "Listen() failed." << endl;
    47.         shutdown(sock2, SD_BOTH);
    48.         closesocket(sock2);
    49.         delete[] recvbuf;
    50.     }
    51. //////////////////////////////////////////////////////////////////////  //////////////////////
    52. #ifdef _DEBUG
    53.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0);
    54.     sprintf(DebugBuffer, "cui-client: listen: WSAGetLastError() returned %s", GetLastErrorBuffer);
    55.     OutputDebugString(DebugBuffer);
    56. #endif
    57. //////////////////////////////////////////////////////////////////////  //////////////////////
    58.     // принимаем входящее соединение
    59.     cout << "Waiting for the incoming connection..." << endl;
    60.     while(1)
    61.     {
    62.         AcceptSocket = SOCKET_ERROR;
    63.         while (AcceptSocket == SOCKET_ERROR)
    64.         {
    65.             AcceptSocket = accept(sock2, NULL, NULL);//&remoteAddr, (int*)&remoteAddrLen);
    66. //////////////////////////////////////////////////////////////////////  //////////////////////
    67. #ifdef _DEBUG
    68.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0);
    69.     sprintf(DebugBuffer, "cui-client: accept: WSAGetLastError() returned %s", GetLastErrorBuffer);
    70.     OutputDebugString(DebugBuffer);
    71. #endif
    72. //////////////////////////////////////////////////////////////////////  //////////////////////
    73.         }
    74.         cout << "Incoming connection established." << endl;
    75.         sock2 = AcceptSocket;
    76.         break;
    77.     }
    78.     // принимаем входящий пакет
    79.     bytesRecv = recv(sock2, (char*)recvbuf, 65536, 0);
    80.     // отсылаем hello answer
    81.     bytesSent = send(sock2, (char*)&HelloAnswerTcp, sizeof(HelloAnswerTcp), 0);
    82. //////////////////////////////////////////////////////////////////////  //////////////////////
    83. #ifdef _DEBUG
    84.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0);
    85.     sprintf(DebugBuffer, "cui-client: recv: WSAGetLastError() returned %s; bytesRecv = %d", GetLastErrorBuffer, bytesRecv);
    86.     OutputDebugString(DebugBuffer);
    87. #endif
    88. //////////////////////////////////////////////////////////////////////  //////////////////////
    89.  
    90.     shutdown(sock2, SD_BOTH);
    91.     closesocket(sock2);
    92.     delete[] recvbuf;
    93. }




    На все syn-пакеты система отправляет rst-пакеты, а должна ведь вернуться функция accept(). В чем дело - не пойму:dntknw:
     
  2. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    а разве можно так

    accept(sock2, NULL, NULL)

    я подставляю туда PSOCKADDR и int* для возврата адреса
     
  3. Bert

    Bert New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    20
    Адрес:
    Russia
    Попробуй вместо
    Код (Text):
    1. AcceptSocket = accept(sock2, NULL, NULL);//&remoteAddr, (int*)&remoteAddrLen);


    написать
    Код (Text):
    1.  
    2. remoteAddrLen = sizeof(remoteAddr);
    3. memset(&remoteAddr, 0, remoteAddrLen);
    4. AcceptSocket = accept(sock2, (sockaddr*)&remoteAddr, &remoteAddrLen);
    5.  


    И переменную remoteAddr объяви как
    Код (Text):
    1.  
    2. sockaddr_in remoteAddr;
    3.  
     
  4. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    remoteAddr нулями забивать не обязательно... у меня и так работает...
     
  5. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125


    Да, так можно, если не хочешь получать адрес коннектящегося.



    Что касается проблемы - я нашел, в чем было дело. Я забыл сконвертировать tcpPort в network byte order, болван...

    Всем спасибо за внимание.