一尘不染

套接字上的“连接”调用可以成功返回,而无需服务器调用“接受”吗?

linux

服务器已创建一个套接字并绑定到端口,并启动了一个正在循环以接受连接的线程。有时由于异常导致线程退出而退出了稍后的循环,但是套接字仍然绑定到端口。现在,如果客户端与该服务器建立“连接”,则说明连接成功。这怎么可能?如果我理解正确,则仅当服务器在侦听套接字上执行“接受”操作后,“连接”才返回。我在这里想念什么吗?


阅读 193

收藏
2020-06-07

共1个答案

一尘不染

如果我理解正确,则仅当服务器在侦听套接字上执行“接受”操作后,“连接”才返回。我在这里想念什么吗?

是。TCP在幕后建立连接(三向握手),并在就绪时将其放入完整的连接队列中。Accept()从此队列的前面返回下一个等待的连接。

从客户端的角度来看,它是“连接”的,但是直到服务器接受并开始处理后,它才会与任何人交谈。有点像当您致电公司并立即进入保留队列时。您已“建立联系”,但是除非有人真正接听并开始交谈,否则您将无法完成任何业务。

您的单个线程可能已经死亡,但是该进程仍处于活动状态,并且文件描述符仍处于打开状态,因此TCP不知道应用程序级别发生了什么。

2020-06-07