winsock を使用して単純なクライアント/サーバー アプリケーションを作成しました。サーバーとクライアントは、localhost の TCP ポート 76567 (私が選んだランダムな番号) を介して接続し、通信します。私は 3 台のデスクトップでテストしました。2 台は XP を実行し、もう 1 台は Win7 を実行しています。また、4 台のラップトップでテストしました。3 台は Win7 を実行し、1 台は XP を実行しています。アプリケーションはすべてのデスクトップ マシンと XP ラップトップで正常に動作しますが、クライアントがサーバーに接続しようとすると、3 台の 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();
}
どうもありがとう :)