我为我的Windows桌面编写了一个简单的C ++服务器,它与我正在开发的移动应用程序进行通信。当两者通信时,客户端连接,发送一些数据,从服务器接收数据,然后关闭连接。
然而,偶尔,客户端将连接,发送数据,然后超时等待服务器响应。在这些情况下,服务器似乎卡在accept()函数中 - 尽管客户端看到了连接(我还确认使用Wireshark成功进行了TCP握手),但accept()继续阻塞。一旦发生这种情况,后续的连接尝试将遇到同样的命运 - 一个成功的连接,但服务器没有响应。
好的,现在对于最奇怪的部分 - 当服务器被阻塞时,我在终端中输入Ctrl + C,我的服务器程序没有被杀死,而是唤醒并处理所有已建立的连接。发生了什么???
服务器代码(减去一些未触发的错误检查):
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData))
struct sockaddr_in sockaddr;
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = INADDR_ANY;
sockaddr.sin_port = htons(51119);
SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(ListenSocket, (SOCKADDR *) &sockaddr, sizeof (sockaddr)) == SOCKET_ERROR)
listen(ListenSocket, 100)
for(;;) {
printf("Listening ... ");
SOCKET ClientSocket = accept(ListenSocket, NULL, NULL);
printf("connected!\n");
// Receive data from client, send back response ...
}
}
答案 0 :(得分:0)
看起来UKMonkey是正确的,问题出在windows终端上。
似乎点击终端内部会触发文本选择模式,一旦他们尝试输出到终端,就会停止运行程序。当我按下Ctrl + C时,这结束了文本选择模式,允许我的程序恢复...
可以禁用这个可怕的,可怕的功能,取消选中终端属性中的QuickEdit Mode选项。