Вот код: Код (Text): VOID Receive2() { sockaddr_in service; sockaddr remoteAddr; UINT remoteAddrLen; UCHAR* recvbuf = new UCHAR[65536]; UINT bytesSent; UINT bytesRecv; // создаем сокет для входящих соединений sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock2 == INVALID_SOCKET) { cout << "Socket() failed when creating the socket for incoming connections." << endl; delete[] recvbuf; } ////////////////////////////////////////////////////////////////////// ////////////////////// #ifdef _DEBUG FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0); sprintf(DebugBuffer, "cui-client: Receive2: bind: WSAGetLastError() returned %s", GetLastErrorBuffer); OutputDebugString(DebugBuffer); #endif ////////////////////////////////////////////////////////////////////// ////////////////////// // binding the socket service.sin_family = AF_INET; service.sin_addr.s_addr = ADDR_ANY; service.sin_port = tcpPort; if (bind(sock2, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) { cout << "Bind() failed." << endl; shutdown(sock2, SD_BOTH); closesocket(sock2); delete[] recvbuf; } ////////////////////////////////////////////////////////////////////// ////////////////////// #ifdef _DEBUG FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0); sprintf(DebugBuffer, "cui-client: bind: WSAGetLastError() returned %s", GetLastErrorBuffer); OutputDebugString(DebugBuffer); #endif ////////////////////////////////////////////////////////////////////// ////////////////////// // listening on the socket if (listen(sock2, SOMAXCONN) == SOCKET_ERROR) { cout << "Listen() failed." << endl; shutdown(sock2, SD_BOTH); closesocket(sock2); delete[] recvbuf; } ////////////////////////////////////////////////////////////////////// ////////////////////// #ifdef _DEBUG FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0); sprintf(DebugBuffer, "cui-client: listen: WSAGetLastError() returned %s", GetLastErrorBuffer); OutputDebugString(DebugBuffer); #endif ////////////////////////////////////////////////////////////////////// ////////////////////// // принимаем входящее соединение cout << "Waiting for the incoming connection..." << endl; while(1) { AcceptSocket = SOCKET_ERROR; while (AcceptSocket == SOCKET_ERROR) { AcceptSocket = accept(sock2, NULL, NULL);//&remoteAddr, (int*)&remoteAddrLen); ////////////////////////////////////////////////////////////////////// ////////////////////// #ifdef _DEBUG FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0); sprintf(DebugBuffer, "cui-client: accept: WSAGetLastError() returned %s", GetLastErrorBuffer); OutputDebugString(DebugBuffer); #endif ////////////////////////////////////////////////////////////////////// ////////////////////// } cout << "Incoming connection established." << endl; sock2 = AcceptSocket; break; } // принимаем входящий пакет bytesRecv = recv(sock2, (char*)recvbuf, 65536, 0); // отсылаем hello answer bytesSent = send(sock2, (char*)&HelloAnswerTcp, sizeof(HelloAnswerTcp), 0); ////////////////////////////////////////////////////////////////////// ////////////////////// #ifdef _DEBUG FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, WSAGetLastError(), 0, GetLastErrorBuffer, 260, 0); sprintf(DebugBuffer, "cui-client: recv: WSAGetLastError() returned %s; bytesRecv = %d", GetLastErrorBuffer, bytesRecv); OutputDebugString(DebugBuffer); #endif ////////////////////////////////////////////////////////////////////// ////////////////////// shutdown(sock2, SD_BOTH); closesocket(sock2); delete[] recvbuf; } На все syn-пакеты система отправляет rst-пакеты, а должна ведь вернуться функция accept(). В чем дело - не пойму
Попробуй вместо Код (Text): AcceptSocket = accept(sock2, NULL, NULL);//&remoteAddr, (int*)&remoteAddrLen); написать Код (Text): remoteAddrLen = sizeof(remoteAddr); memset(&remoteAddr, 0, remoteAddrLen); AcceptSocket = accept(sock2, (sockaddr*)&remoteAddr, &remoteAddrLen); И переменную remoteAddr объяви как Код (Text): sockaddr_in remoteAddr;
Да, так можно, если не хочешь получать адрес коннектящегося. Что касается проблемы - я нашел, в чем было дело. Я забыл сконвертировать tcpPort в network byte order, болван... Всем спасибо за внимание.