【发布时间】:2011-01-25 10:35:21
【问题描述】:
服务器创建了一个套接字并绑定到一个端口并启动了一个正在循环中的线程以接受连接。稍后循环由于异常导致线程退出而退出,但套接字仍然绑定到端口。现在,如果客户端“连接”到该服务器,它就成功了。这怎么可能?如果我理解正确,则仅在服务器在侦听套接字上“接受”后才返回“连接”。我在这里遗漏了什么吗?
【问题讨论】:
标签: linux sockets tcp network-programming
服务器创建了一个套接字并绑定到一个端口并启动了一个正在循环中的线程以接受连接。稍后循环由于异常导致线程退出而退出,但套接字仍然绑定到端口。现在,如果客户端“连接”到该服务器,它就成功了。这怎么可能?如果我理解正确,则仅在服务器在侦听套接字上“接受”后才返回“连接”。我在这里遗漏了什么吗?
【问题讨论】:
标签: linux sockets tcp network-programming
连接的套接字进入队列等待接收进程接受()它们。这些积压是有限的,一旦达到,操作系统将开始拒绝连接或忽略它们。
【讨论】:
如果我理解正确,“连接”仅在服务器在侦听套接字上“接受”后才会返回。我在这里遗漏了什么吗?
是的。 TCP 在幕后建立连接 - 3 次握手 - 并在准备好时将其放入已完成的连接队列中。 Accept() 从这个队列的前面返回下一个等待连接。
从客户端的角度来看,它是“连接的”,但在服务器接受并开始处理之前它不会与任何人交谈。有点像当您致电一家公司并立即进入等待队列时。您已“连接”,但在有人真正接起并开始讲话之前,您不会做任何事情。
您的单个线程可能已经死亡,但进程仍然存在,并且文件描述符仍然打开,因此 TCP 不知道应用程序级别发生了什么。
【讨论】:
backlog 调用的 backlog 参数的全部意义 - 积压是可以在该连接但未连接的连接数任何时候都接受的状态。