ソケット(ブロッキング)で2バイトのアプリデータを10秒ごとに送信しますが、最後のインスタンスで送信呼び出しが40秒を超えて長くブロックされました。
- 2012-06-13 12:02:46.653417|情報|送信前
- 2012-06-13 12:02:46.653457 |情報|送信後(2)
- 2012-06-13 12:02:57.566898|情報|送信前
- 2012-06-13 12:02:57.566962 |情報|送信後(2)
- 2012-06-13 12:03:08.234060|情報|送信前
- 2012-06-13 12:03:08.234101 |情報|送信後(2)
- ** 2012-06-13 12:03:19.010743|情報|送信前
- 2012-06-13 12:04:00.969162 |情報|送信後(2)**
machine(linux)のtcpのデフォルトの送信バッファサイズは65536です。
2バイトのデータはサーバーとのハートビートであり、サーバーはクライアントが少なくとも15秒に1回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;
}