为什么 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,因为服务器不会 back 到 listen()
,3whs 是哪个?或者为什么 accept()
阻塞而不是 listen()
?
listen()
和accept()
是两个完全不同的操作。你对它们如何工作的理解是错误的。
listen()
只是设置监听套接字的积压并打开绑定端口,因此客户端可以开始连接到套接字。那个打开是一个非常快速的操作,不用担心它会阻塞。
listen()
未执行 3 次握手。当客户端尝试连接到打开的端口并被放入监听套接字的积压中时,它由内核执行。每个新的客户端连接都执行自己的 3 次握手。
一旦客户端连接完全握手,该连接就可供 accept()
从待办事项列表中提取。 accept()
阻塞(或者,如果您使用非阻塞侦听套接字,accept()
成功)仅当新的客户端连接可用于后续通信时。
你只调用listen()
1 次,打开监听端口,仅此而已。然后,您必须为要与之通信的每个客户端调用 accept()
。这就是 accept()
阻塞而 listen()
不阻塞的原因。
accept()
块,直到建立另一个连接并且 return sockfd 可以在双方上进行通信。但是为什么 accept()
会阻塞,当首先完成的是三向握手时。握手 不是 由 accept()
完成,而是由 listen()
完成。所以我希望 listen()
阻塞而不是 accept()
,因为它首先涉及 TCP。我知道内核会对传入连接进行一些排队,但第一个涉及的函数仍然是 listen()
,然后连接在队列中向前移动到 accept()
。因此,当我进行第一次连接时,listen()
将执行 3whs,并且服务器在 accpet()
中阻塞。所以另一个连接不能再做 3whs,因为服务器不会 back 到 listen()
,3whs 是哪个?或者为什么 accept()
阻塞而不是 listen()
?
listen()
和accept()
是两个完全不同的操作。你对它们如何工作的理解是错误的。
listen()
只是设置监听套接字的积压并打开绑定端口,因此客户端可以开始连接到套接字。那个打开是一个非常快速的操作,不用担心它会阻塞。
listen()
未执行 3 次握手。当客户端尝试连接到打开的端口并被放入监听套接字的积压中时,它由内核执行。每个新的客户端连接都执行自己的 3 次握手。
一旦客户端连接完全握手,该连接就可供 accept()
从待办事项列表中提取。 accept()
阻塞(或者,如果您使用非阻塞侦听套接字,accept()
成功)仅当新的客户端连接可用于后续通信时。
你只调用listen()
1 次,打开监听端口,仅此而已。然后,您必须为要与之通信的每个客户端调用 accept()
。这就是 accept()
阻塞而 listen()
不阻塞的原因。