同じブースト asio UDP 非同期コードを使用する、ほぼ同一の 2 つのテスト プログラム (A & B) があります。
受信呼び出しは次のとおりです。
_mSocket.async_receive_from(
boost::asio::buffer(_mRecvBuffer), _mReceiveEndpoint,
boost::bind(&UdpConnection::handle_receive, this,_mReceiveEndpoint,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
// _mReceiveEndpoint is known and good. the buffer is good too.
// ここにハンドラーがあります
void handle_receive(const udp::endpoint recvFromEP, const boost::system::error_code& error,std::size_t bytesRecv/*bytes_transferred*/)
{
boost::shared_ptr<std::string> message(new std::string(_mRecvBuffer.c_array(),bytesRecv));
if (!error)
{
doSomeThingGood();
}
else {
cerr << "UDP Recv error : " << error << endl;
}
}
では、すべて localhost で何が起こるかを説明します。
プログラム 'A' を最初に起動すると、プログラム 'B', 'A' で UDP Recv エラー : server:10061 が発生します。プログラム「A」は問題なく送信を続け、「B」は問題なく受信します。
上記の文で「A」と「B」を入れ替えることができますが、それはそのままです。
mSocket.async_receive_from を再度呼び出して読み取り不良状態をリセットしようとすると、エラー 10054 が発生します。
これらのエラーを Web で調べましたが、あまり役に立ちませんでした。
これらが何を意味するのか、この状態が発生した場合にプログラム内でどのように回復できるかについて、誰か考えがありますか? ソケットをリセットする方法はありますか?
健全性チェック.... 両方のプログラムが 2 つのポートのみのループバックで動作できますか? A 送信 = 20000、A 受信 = 20001 B 送信 = 20001、B 受信 = 20000
TL;DR 送信する前にリッスンしようとすると、エラーが発生して回復できないようです。送信後に聞けば大丈夫です。
-- 編集 - McAfee のホスト侵入防止機能が厄介なことをしているようです.... VS2010 でデバッグすると、DLL でスタックしてしまいます。
ありがとう