服务器已经创建了一个套接字并绑定到一个端口并启动了一个循环的线程来接受该连接。稍后循环由于异常导致线程退出而退出但是套接字仍然限制为端口。现在,如果客户端对此服务器进行“连接”,则它会成功。这怎么可能?如果我理解正确,'connect'仅在服务器在侦听套接字上“接受”后返回。我在这里错过了什么吗?
答案 0 :(得分:22)
如果我理解正确,'connect'仅在服务器在侦听套接字上'接受'后返回。我在这里错过了什么吗?
是。 TCP建立连接 - 三次握手 - 在封面下,并在准备就绪时将其放入已完成的连接队列中。 Accept()从此队列的前面返回下一个等待连接。
从客户端的角度来看,它是“连接”的,但在服务器接受并开始处理之前,它不会与任何人交谈。有点像你打电话给公司并立即进入保留队列。你是“连接起来的”,但在有人真正接听并开始说话之前,不会做任何事情。
您的个别线程可能已经死亡,但进程仍然存在且文件描述符仍然打开,因此TCP不知道应用程序级别发生了什么。
答案 1 :(得分:4)
连接的套接字进入队列,等待接收进程接受()它们。这些积压有限,一旦达到,操作系统将开始拒绝连接或忽略连接。