Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP-对等方如何知道接受失败的时间?_Tcp - Fatal编程技术网

TCP-对等方如何知道接受失败的时间?

TCP-对等方如何知道接受失败的时间?,tcp,Tcp,据我所知,一旦我们使用绑定套接字完成“侦听”调用,客户端启动的所有TCP连接都将开始成功,但是,当调用accept时,accept调用很有可能会失败(由于内存或文件描述符超出限制等原因) 我在solaris中运行了一些简单的测试 服务器: 1.使用ulimit命令将文件描述符的最大数量减少到8 在listen to 8中设置待办事项 听一听 在循环中调用accept 8次,然后进入睡眠状态 客户: 连接大约8个连接 睡觉 测试结果: 在客户端,所有连接都通过。 在服务器端,只接受4次通过,失败4

据我所知,一旦我们使用绑定套接字完成“侦听”调用,客户端启动的所有TCP连接都将开始成功,但是,当调用accept时,accept调用很有可能会失败(由于内存或文件描述符超出限制等原因)

我在solaris中运行了一些简单的测试

服务器: 1.使用ulimit命令将文件描述符的最大数量减少到8

  • 在listen to 8中设置待办事项

  • 听一听

  • 在循环中调用accept 8次,然后进入睡眠状态

  • 客户:

  • 连接大约8个连接

  • 睡觉

  • 测试结果:

    在客户端,所有连接都通过。 在服务器端,只接受4次通过,失败4次。(考虑到3个文件描述符用于标准,一个用于侦听,然后只有4个连接的空间,这是合理的)。但是,netstat显示所有8个已建立的连接

    TCP转储,显示所有8个连接的3向握手均已成功。服务器何时会通知客户端上的4个连接失败?(即,什么时候会向他们发送FIN?)

    我还注意到另一个行为,一旦服务器进入睡眠状态,然后如果我通过执行CTRL+C终止进程,那么我发现正在为这4个失败的连接发送FIN


    我对这种行为有点困惑。非常感谢您的帮助。

    根据您的描述,我猜操作系统确实已经建立了所有8个连接,并将缓冲客户端发送的任何数据(最大窗口大小)。一旦您的服务器释放了一些FD并能够接受挂起的连接,您应该能够读取在此之前发送的任何内容。这也解释了为什么进程终止时连接会终止


    简言之:连接确实存在,但您的程序无法使用它们,因为它没有空闲的FD。

    而连接存在是因为,与FD不同,存在空闲端口,对吗?