服务器在侦听客户端连接时是否阻止执行?

时间:2019-12-18 17:18:47

标签: c++ winapi

我是套接字编程的新手,我想使用winapi创建客户端/服务器类型的应用程序。我希望我的应用程序正在侦听来自客户端的请求,在为客户端提供服务之后,它应该继续侦听其他请求。但是在尝试之前,我将先获得概述以了解整个过程。我的问题是,当您在服务器端调用listen()时,listen()块是否会执行到客户端尝试建立连接为止? 接受并服务当前客户端后,如何返回其他连接的侦听模式?因为从我在所访问的站点上看到的代码来看,没有一个循环在为客户提供服务后再次调用listen(),因此直接进入close()。

请原谅我未添加任何代码,因为我想在自己尝试之前获得基本知识。

2 个答案:

答案 0 :(得分:1)

  

当您在服务器端调用listen()时,listen()块是否会执行到客户端尝试建立连接为止?

不。 listen()只需打开侦听端口并建立待办事项以保存挂起的连接,然后退出。而是accept()阻止等待连接(如果您在阻止模式下使用它,这是默认设置)。

  

在接受并服务当前客户端之后,它如何回到侦听模式以进行其他连接?

由您决定何时发生。在您再次调用accept()之前,服务器将不会返回监听状态。因此,您需要在服务器的生命周期中循环调用accept()。但是,服务器设计将决定何时调用accept()

如果您想一次仅服务1个客户端,则只需有1个循环调用accept(),为该客户端提供全部服务,关闭接受的套接字,然后返回accept()

但是,如果要并行服务多个客户端,则需要尽可能频繁地接受客户端,方法是在专用线程或accept()循环中调用select(),或者使用{ {1}}在后​​台通过重叠的I / O或I / O完成端口。接受客户端后,您需要确定是要直接在AcceptEx()循环中还是在其自己的专用线程中,或者通过重叠I / O或IOCP为该客户端提供服务。

  

从我在所访问的站点上看到的代码来看,没有一个循环在为客户提供服务后再次调用listen(),直接进入close()。

否,永远不会有select()循环。 listen()仅在打开服务器端口时被调用一次。但是您确实需要listen()循环来接受客户端。

  

请原谅我没有添加任何代码,因为我想在自己尝试之前获得基本知识。

从字面上看,在线上有大量的套接字教程,以及MSDN上详细的WinSock文档和示例。他们都涵盖了这个主题。

答案 1 :(得分:0)

从图中可以看出,listen()上没有阻止 另外,此link可能会对您有所帮助。

From the block you can which are blocking calls