C++ 停止接受新连接

C++ 停止接受新连接,c++,multithreading,networking,C++,Multithreading,Networking,我想停止接受来自主线程的连接。。我在这里复制了原始代码。在这个服务器上。它会为每个连接生成一个新线程。有一个单独的线程来清理连接池,另一个线程用于处理用户命令,所有这些都可以完美地工作。我只想停止接受基于用户命令的新连接。accept方法存在于主线程中,我使用以下逻辑停止接受 while (bListening && (sctCommSocket = accept(sctBaseSocket,(struct sockaddr *)&addrClient,&c))

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

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

但是在将Blisting设置为true之后。。循环仍然接受1个连接。。但这并非意料之中。设置标志时,请说明循环已在
accept()
中被阻止,因此它接受了下一个连接。

这与此处提出的问题非常相似:

我认为这也会解决您的问题,尽管代码片段中不清楚您使用的是什么操作系统和多线程库

编辑:

以下是一个很好的网络编程指南:

专门解决阻塞问题的部分是


解决这个问题有多种方法,哪种方法“最好”取决于您的具体情况。正如一位评论员所建议的,在第一次调用accept之前,您必须将套接字设置为非阻塞状态。

I理解逻辑陷阱。。你能提出一个解决办法吗。。是否有任何暂停机制而不是尝试这种方式如果您想停止接受,请关闭侦听套接字。由于侦听待办事项队列,其他任何操作都无法完成。不修复此问题可能更容易,但只需断开不需要的连接即可。链接中的注释清楚地表明,更改阻止模式不会影响已在进行的
accept()
。@EJP Right;在调用它之前,必须将其设置为非阻塞。然后,一旦bListening为false,您必须在其周围编写额外的代码以停止调用它。该链接解释了如何使accept()成为非阻塞的,这样就可以修改调用代码来执行询问者想要的操作。