服务器已创建一个套接字并绑定到端口,并启动了一个正在循环以接受连接的线程。有时由于异常导致线程退出而退出了稍后的循环,但是套接字仍然绑定到端口。现在,如果客户端与该服务器建立“连接”,则说明连接成功。这怎么可能?如果我理解正确,则仅当服务器在侦听套接字上执行“接受”操作后,“连接”才返回。我在这里想念什么吗?
如果我理解正确,则仅当服务器在侦听套接字上执行“接受”操作后,“连接”才返回。我在这里想念什么吗?
是。TCP在幕后建立连接(三向握手),并在就绪时将其放入完整的连接队列中。Accept()从此队列的前面返回下一个等待的连接。
从客户端的角度来看,它是“连接”的,但是直到服务器接受并开始处理后,它才会与任何人交谈。有点像当您致电公司并立即进入保留队列时。您已“建立联系”,但是除非有人真正接听并开始交谈,否则您将无法完成任何业务。
您的单个线程可能已经死亡,但是该进程仍处于活动状态,并且文件描述符仍处于打开状态,因此TCP不知道应用程序级别发生了什么。