在没有服务器调用'accept'的情况下,套接字上的'connect'调用可以成功返回

kum*_*mar 15 sockets linux network-programming tcp

服务器已创建一个套接字并绑定到一个端口,并启动一个循环中的线程来接受该连接.稍后循环由于异常导致线程退出而退出但是套接字仍然限制为端口.现在,如果客户端对此服务器进行"连接",则它会成功.这怎么可能?如果我理解正确,'connect'仅在服务器在侦听套接字上"接受"后返回.我在这里错过了什么吗?

Duc*_*uck 25

如果我理解正确,'connect'仅在服务器在侦听套接字上"接受"后返回.我在这里错过了什么吗?

是.TCP建立连接 - 三次握手 - 在封面下,并在准备就绪时将其放入已完成的连接队列中.Accept()从此队列的前面返回下一个等待连接.

从客户端的角度来看,它是"连接"的,但在服务器接受并开始处理之前,它不会与任何人交谈.有点像你打电话给公司并立即进入保留队列.你是"连接"的,但是在有人真正接听并开始说话之前,不会做任何事情.

您的单个线程可能已经死亡,但进程仍然存在且文件描述符仍然打开,因此TCP不知道应用程序级别发生了什么.

  • 电话服务保持队列和尚未接受()编辑的TCP连接之间的区别:从TCP连接发送的任何字节都由操作系统缓冲,并且一旦调用accept()已被接收制作.在电话系统保持线路上,呼叫者说的任何内容都将被丢弃. (3认同)
  • 值得指出的是,这就是`listen()`调用的`backlog`参数的全部内容 - 积压是在任何时候都可以处于连接但未被接受的状态的连接数. (2认同)