【发布时间】:2019-05-14 16:49:18
【问题描述】:
首先,我知道有一些方法可以通过分叉或线程来处理多个客户端请求。但我不明白为什么服务器不能在没有分叉或线程的情况下多次接受。 accept() 调用可以简单地接受所有希望连接到它的进程。除非客户端断开连接,否则为什么调用(accept())不能继续?
server 使用阻塞(默认)方式执行 socket()、listen() 和 bind()
默认情况下,客户端也是如此,socket() 和 connect()
我认为接受的返回值将用于最近的孩子。但实际上它会一直阻塞,直到前一个客户端断开连接。
【问题讨论】:
-
不太清楚你的意思是什么:“但实际上它会阻塞,直到前一个客户端切断它的连接。” 在阻塞模式下,
accept阻塞直到存在连接,然后返回文件描述符。如果您愿意,您也可以将accept置于非阻塞模式:“如果套接字标记为非阻塞并且队列中没有挂起的连接,则accept() 将失败并显示错误EAGAIN 或EWOULDBLOCK。 " -
@MFisherKDX 感谢您的回答。两个客户端同时要连接到单进程服务器会发生什么?
-
您必须以某种方式管理客户端 IO。您可以使用
select来确定 IO 何时可用,然后根据需要为客户端提供服务。 -
@MFisherKDX 我想知道是否有接受()覆盖返回的文件描述符?如果没有,怎么办?必须有。这就是我不明白的地方