accept() 块(有挂起的连接); Ctrl+C 解锁?
accept() blocks (with pending connections); Ctrl+C unblocks?
我已经为我的 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 ...
}
}
看起来 UKMonkey 是正确的,问题出在 windows 终端上。
似乎在终端内部单击会触发文本选择模式,一旦 运行 程序尝试输出到终端,该模式就会停止。当我按下 Ctrl+C 时,这结束了文本选择模式,允许我的程序继续...
可以通过取消选中终端属性中的“快速编辑模式”选项来禁用这个可怕的功能。
我已经为我的 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 ...
}
}
看起来 UKMonkey 是正确的,问题出在 windows 终端上。
似乎在终端内部单击会触发文本选择模式,一旦 运行 程序尝试输出到终端,该模式就会停止。当我按下 Ctrl+C 时,这结束了文本选择模式,允许我的程序继续...
可以通过取消选中终端属性中的“快速编辑模式”选项来禁用这个可怕的功能。