为什么 accept() 会阻塞,而 listen() 是第一个参与 TCP 的?

Why does accept() block, when listen() is the very first involved in TCP?

accept() 块,直到建立另一个连接并且 return sockfd 可以在双方上进行通信。但是为什么 accept() 会阻塞,当首先完成的是三向握手时。握手 不是 accept() 完成,而是由 listen() 完成。所以我希望 listen() 阻塞而不是 accept(),因为它首先涉及 TCP。我知道内核会对传入连接进行一些排队,但第一个涉及的函数仍然是 listen(),然后连接在队列中向前移动到 accept()。因此,当我进行第一次连接时,listen() 将执行 3whs,并且服务器在 accpet() 中阻塞。所以另一个连接不能再做 3whs,因为服务器不会 backlisten(),3whs 是哪个?或者为什么 accept() 阻塞而不是 listen()

listen()accept()是两个完全不同的操作。你对它们如何工作的理解是错误的。

listen() 只是设置监听套接字的积压并打开绑定端口,因此客户端可以开始连接到套接字。那个打开是一个非常快速的操作,不用担心它会阻塞。

listen() 未执行 3 次握手。当客户端尝试连接到打开的端口并被放入监听套接字的积压中时,它由内核执行。每个新的客户端连接都执行自己的 3 次握手。

一旦客户端连接完全握手,该连接就可供 accept() 从待办事项列表中提取。 accept() 阻塞(或者,如果您使用非阻塞侦听套接字,accept() 成功)仅当新的客户端连接可用于后续通信时。

你只调用listen() 1 次,打开监听端口,仅此而已。然后,您必须为要与之通信的每个客户端调用 accept()。这就是 accept() 阻塞而 listen() 不阻塞的原因。