【问题标题】:Stop accepting new connections停止接受新连接
【发布时间】:2016-11-04 07:00:42
【问题描述】:

我想停止接受来自主线程的连接。我在这里复制了原始代码。在这台服务器上。它为每个连接生成一个新线程。有一个单独的线程来清理连接池和另一个用于用户命令处理的线程都可以完美地工作。我只想停止接受基于用户命令的新连接。主线程中存在accept方法我使用以下逻辑停止接受

while (bListening && (sctCommSocket = accept(sctBaseSocket,(struct sockaddr *)&addrClient,&c)) != INVALID_SOCKET)

但是在将 bListening 设置为 true 之后.. 循环仍然接受 1 个连接.. 但这不是预期的。请解释

【问题讨论】:

  • 不修复此问题可能更容易,只需断开不需要的连接即可。

标签: c++ multithreading networking


【解决方案1】:

当您设置标志时,循环已在accept() 中被阻止,因此它接受了下一个连接。

【讨论】:

  • 我理解逻辑陷阱..你能建议一个解决方案吗..有什么暂停机制而不是尝试这种方式
  • 如果你想停止接受,关闭监听套接字。由于侦听积压队列,其他任何事情都不会做。
【解决方案2】:

这与这里提出的问题非常相似:Is it possible (and safe) to make an accepting socket non-blocking?

我认为这也可以解决您的问题,尽管从代码 sn-p 中不清楚您使用的是什么操作系统和多线程库。

编辑:

这是一个很好的网络编程指南:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html

专门解决阻塞问题的部分是http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#Blocking

有多种方法可以解决此问题,哪种方法“最好”取决于您的具体情况。正如评论者建议的那样,您必须在第一次调用 accept 之前将套接字设置为非阻塞。

【讨论】:

  • 链接中的 cmets 明确指出,更改阻止模式不会影响已在进行中的 accept()
  • @EJP 对;在调用它之前,您必须将其设置为非阻塞。然后你必须在它周围编写额外的代码,以便在 bListening 为 false 时停止调用它。该链接解释了如何使 accept() 非阻塞,以便可以修改调用代码以执行询问者的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2019-04-30
相关资源
最近更新 更多