我每 10 秒在套接字上发送 2 个字节的应用程序数据(阻塞),但发送调用在最后一个实例中被阻塞超过 40 秒。
- 2012-06-13 12:02:46.653417|信息|发送前
- 2012-06-13 12:02:46.653457|INFO|发送后(2)
- 2012-06-13 12:02:57.566898|信息|发送前
- 2012-06-13 12:02:57.566962|INFO|发送后(2)
- 2012-06-13 12:03:08.234060|信息|发送前
- 2012-06-13 12:03:08.234101|INFO|发送后 (2)
- **2012-06-13 12:03:19.010743|信息|发送前
- 2012-06-13 12:04:00.969162|INFO|发送后 (2)**
机器(linux)上的 tcp 默认发送缓冲区大小为 65536。
2 个字节的数据用于与服务器进行心跳,服务器希望客户端至少每 15 秒发送一次 HB。
另外,我没有禁用 naggle 的算法。
问题是 - 发送呼叫能否被阻塞这么长时间(如 40 秒)?而且它只是偶尔发生,它是在运行近 12 小时后发生的。
我知道的发送调用应该只是将数据复制到 TCP 发送缓冲区。
每 10 秒调用一次发布。不,它不会逐渐减慢发送呼叫的速度。它突然发生一次,然后由于另一侧的套接字关闭,因此应用程序退出。
int publish(char* buff, int size) const {
/* Adds the 0x0A to the end */
buff[size]=_eolchar;
if (_debugMode)
{
ACE_DEBUG((MY_INFO "before send\n"));
}
int ret = _socket.send((void*)buff, size+1);
if (_debugMode)
{
ACE_DEBUG((MY_INFO "after send (%d)\n", ret));
//std::cout << "after send " << ret << std::endl;
}
if (ret < 1)
{
ACE_DEBUG((MY_ERROR "Socket error, FH going down\n"));
ACE_OS::sleep(1);
abort();
}
return ret;
}