accept()块(具有挂起的连接); Ctrl + C取消阻止?

时间:2018-01-10 16:58:19

标签: c++ sockets network-programming

我为我的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 ...
  }
}

1 个答案:

答案 0 :(得分:0)

看起来UKMonkey是正确的,问题出在windows终端上。

似乎点击终端内部会触发文本选择模式,一旦他们尝试输出到终端,就会停止运行程序。当我按下Ctrl + C时,这结束了文本选择模式,允许我的程序恢复...

可以禁用这个可怕的,可怕的功能,取消选中终端属性中的QuickEdit Mode选项。