我每10秒钟在套接字(阻塞)上发送2个应用程序数据字节,但是在上面的最后一次中,发送调用被阻塞了40多秒。
- 2012-06-13 12:02:46.653417|INFO|发送前
- 2012-06-13 12:02:46.653457|INFO|发送后(2)
- 2012-06-13 12:02:57.566898|INFO|发送前
- 2012-06-13 12:02:57.566962|INFO|发送后(2)
- 2012-06-13 12:03:08.234060|INFO|发送前
- 2012-06-13 12:03:08.234101|INFO|发送后(2)
- **2012-06-13 12:03:19.010743|INFO|发送前
- 2012-06-13 12:04:00.969162|INFO|发送后(2)**
机器(Linux)上TCP默认发送缓冲区大小为65536。
2个字节的数据是与服务器进行心跳,并且服务器期望客户端至少每15秒发送一次HB。
另外,我没有禁用 Nagle 算法。
问题是 - 发送调用是否可以阻塞40秒?而且只是偶尔发生,它会在运行了接近12小时之后发生。
我知道发送调用只是将数据复制到TCP发送缓冲区。
publish 每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;
}