Я написал простое клиент-серверное приложение с использованием winsock. Сервер и клиент подключаются и обмениваются данными через TCP-порт 76567 (я выбрал случайное число) на локальном хосте. Я тестировал его на трех рабочих столах, два из которых работали под XP, а другой под управлением Win7, я также тестировал его на четырех ноутбуках, трех из которых работали под Win7 и один под управлением XP. Приложение отлично работает на всех настольных компьютерах и на ноутбуке XP, но на всех трех ноутбуках Win7 я получаю ошибку 10061, когда клиент пытается подключиться к серверу!
Я отключил брандмауэр, но проблема не устранена. Я также осмотрелся, чтобы узнать, что вызывает эту ошибку, и похоже, что клиент пытается подключиться к серверу, который не прослушивает. Однако серверный вызов listen () успешно завершается! Очень странно, что проблема возникает только на ноутбуках с Win7, есть идеи?
Вот мой код инициализации сокета:
// Initialise Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult != 0)
{
printf("WSAStartup failed: %d\n", iResult);
}
// Create a server socket
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if(iResult != 0)
{
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
}
// Create a socket to listen for clients
listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if(listenSocket == INVALID_SOCKET)
{
printf("Error at socket(): %d\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
}
// Bind socket to ip address and port
iResult = bind(listenSocket, result->ai_addr, (int) result->ai_addrlen);
if(iResult == SOCKET_ERROR)
{
printf("bind failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(listenSocket);
WSACleanup();
}
freeaddrinfo(result);
// Listen for connection requests
if(listen(listenSocket, SOMAXCONN) != 0)
{
printf("Listen failed with error: %d\n", WSAGetLastError());
closesocket(listenSocket);
WSACleanup();
}
Большое спасибо :)