【问题标题】:accept() blocks (with pending connections); Ctrl+C unblocks?accept() 块(带有挂起的连接); Ctrl+C 解除阻塞?
【发布时间】:2018-01-10 16:58:19
【问题描述】:

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

【问题讨论】:

  • 你还没有在终端上进行选择文本之类的操作吗?
  • 不。 Ctrl+C 通常会杀死程序。只有当 accept 挂起时,它才会有这种奇怪的行为......
  • 听起来你的服务器没有在accept 中被阻止,而是在某个地方的system 调用中。 ^C 终止使用system 运行的程序,而不是服务器,然后服务器继续接受调用。也许是在处理以前的客户端连接?在任何情况下,如果没有证明问题的MCVE,您就不可能获得任何帮助。

标签: c++ sockets network-programming


【解决方案1】:

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

似乎在终端内单击会触发文本选择模式,一旦它们尝试输出到终端,就会停止正在运行的程序。当我按下 Ctrl+C 时,这结束了文本选择模式,让我的程序继续......

取消选中终端属性中的快速编辑模式选项可以禁用这个可怕的、可怕的功能。

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多