0

我的应用程序在 solaris 10 中运行。它是 C/S 模型。客户端和服务器程序在同一台服务器中。我已将客户端程序的套接字发送缓冲区设置为 49512 和 TCP_NODELAY 选项。select的超时间隔是1s。当我的客户端运行时,我发现如果网络静态非常大,选择将超时,我想知道什么操作可能导致套接字未准备好。发送缓冲区已满?还是其他人?

4

1 回答 1

1

你是对的: select() 超时,因为发送缓冲区已满。

因为 TCP 协议保证传递,所以在发送者知道它已安全地到达套接字另一端的接收缓冲区之前,数据不会从发送缓冲区中删除。

这意味着发送缓冲区被填满,例如当接收端有一个完整的接收缓冲区时,或者当发送的数据包(或来自接收器的 ACK)在网络上丢失时。

即使 select() 没有超时,发送缓冲区也可能几乎已满,然后您的 write() 调用不会将所有数据写入缓冲区。始终检查您的 write() 或 send() 调用的返回值 - 这给出了实际写入的字节数

于 2012-01-06T15:17:14.650 回答