【发布时间】:2012-04-27 12:33:18
【问题描述】:
我使用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();
}
非常感谢:)
【问题讨论】:
-
笔记本电脑上运行着什么杀毒软件?
-
只是标准的 Windows 安全工具,尽管其中一台笔记本电脑上有 Spybot。不过我不认为这是问题所在,因为台式机上运行着 Kaspersky 或 Norton,我对这些机器没有任何问题。
-
你能显示客户端代码吗?它如何确定要连接的 IP/端口?
标签: winsock winsock2 winsockets