【发布时间】:2012-06-14 16:56:46
【问题描述】:
我每 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|信息|发送前
- 2012-06-13 12:04:00.969162|INFO|发送后 (2)**
机器(linux)上的 tcp 默认发送缓冲区大小为 65536。
2 字节数据用于与服务器进行心跳,服务器希望客户端至少每 15 秒发送一次 HB。
另外,我没有禁用 naggle 的算法。
问题是 - 发送呼叫能否被阻塞这么长时间(例如 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;
}
【问题讨论】:
-
问题到底是什么?有时数据包可能会延迟......
-
请给出发送调用的代码
-
publish() 多久被调用一次?您是否测试过您的 ACE_DEBUG 调用以查看需要多长时间?您是否注意到随着时间的推移会变慢,或者只是一个 40 秒的块然后它恢复正常?
-
publish 每 10 秒调用一次。不,它不会逐渐减慢发送呼叫的速度。它突然发生一次,然后由于另一侧的套接字关闭,因此应用程序退出。 ACE_DEBUG 只是为了打印跟踪而添加的,没有 ACE_DEBUG 也会出现问题。
-
我只能说发送可能会阻塞一段时间,这有时取决于数据包丢失等。