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