【发布时间】:2021-04-17 17:18:19
【问题描述】:
accept() 阻塞,直到建立另一个连接并返回 sockfd 才能使双方通信。但是为什么accept() 会阻塞,而首先要做的是三次握手。握手不是由accept() 完成的,而是由listen() 完成的。所以我希望listen() 阻止而不是accept(),因为它首先涉及 TCP。我知道内核对传入连接进行了一些排队,但涉及的第一个函数仍然是listen(),然后连接在队列中向前移动到accept()。因此,当我进行第一次连接时,listen() 将执行 3whs,并且服务器在accpet() 中阻塞。所以另一个连接不能再做3whs,因为服务器没有返回到listen(),3whs是哪个?或者为什么accept() 阻止而不是listen()?
【问题讨论】:
-
@Carcigenicate 我没有说任何关于改变
listen()函数的行为(所以它不会将connfd返回为accept()),它只会像往常一样处理连接到accept()。但是 accept() 并不是 TCP 中涉及的第一个函数,就像 listen() 那样。这对我来说没有意义 -
正如我所说,监听会阻塞,新连接到达,2whs 完成,该过程将跟随接受()。功能与现在相同,但与新连接的第一次接触将是侦听而不是接受,因为接受不执行 3whs。所以在当前模型中,这对我来说没有意义,因为如果接受 blocs,新连接不能做 3whs,因为它会听而不接受