|
|
1
12
没有看到你的代码我只能猜测。 TCP中出现零窗口的原因是因为接收器的接收缓冲区中没有空间。 有很多种方法可以做到这一点。此问题的一个常见原因是,当您通过LAN或其他相对快速的网络连接发送数据时,一台计算机的速度明显快于另一台计算机。作为一个极端的例子,假设你有一台3Ghz的计算机,通过千兆以太网以尽可能快的速度发送到另一台运行1Ghz cpu的机器。由于发送方的发送速度远远快于接收方的读取速度,因此接收方的recv缓冲区将被填满,从而导致TCP堆栈向发送方公布一个零窗口。 如果发送端和接收端都没有准备好处理这个问题,那么这可能会导致问题。在发送端,如果您使用的是非阻塞I/O,则这可能会导致发送缓冲区填满,并导致发送的调用阻塞或失败。在接收端,您可能在I/O上花费了太多时间,以至于应用程序没有机会处理它的任何数据,并且看起来像是被锁定了。 编辑
一般来说,我认为这不是一个好主意。理想情况下,如果您担心应用程序挂在
看到了吗 socket(7)
主线程可以将每个文件描述符推入
send函数应该如下所示(假设设置了超时):
|
|
|
2
1
使用TCP套接字开发时的一个常见错误是关于read()/write()行为的错误假设。 执行读/写操作时,必须检查返回值,它们可能没有读/写请求的字节数,通常需要一个循环来跟踪并确保传输了整个数据。 |
|
3
0
最可能的问题是,您的代码中有一个错误,无法正确处理部分读取或部分写入。众所周知,Linux和Windows之间的TCP是有效的。 |
|
|
4
0
我试图禁用Nagle的算法(使用TCP\u NODELAY),但不知怎么的,它起了作用。 传输速率更高,TCP窗口大小未满或未重置。 奇怪的是,当我改变窗口大小时,它没有任何影响。 非常感谢。 |