デバイスからデータを受け取り、処理するサーバーを作成しています。ネットワークに中断がない限り(つまり、イーサネットケーブルを抜いてから再接続しない限り)、すべて正常に動作します。私はread_until()を使用しています。これは、デバイスが使用するプロトコルが特定のバイトシーケンスでパケットを終了させるためです。データストリームが中断されると、read_until()が期待通りにブロックされます。しかし、ストリームが再び起動すると、ストリームはブロックされたままです。私がWiresharkでデータストリームを見ると、デバイスは送信を続け、各パケットはネットワークスタックによってACKされます。しかし、bytes_readableを見ると、常に0になります。どのようにして割り込みを検出し、データストリームへの接続を再確立することができますか?以下は、コードスニペットであり、事前にお手伝いいただけるおかげです。 [私に簡単に行く、これが私の最初のスタックオーバーフローの質問です....はい、私は答えを検索してみました。]boost :: asioを使用してネットワーク中断から復旧する方法
using boost::asio::ip::tcp;
boost::asio::io_service IOservice;
tcp::acceptor acceptor(IOservice, tcp::endpoint(tcp::v4(), listenPort));
tcp::socket socket(IOservice);
acceptor.accept(socket);
for (;;)
{
len = boost::asio::read_until(socket, sbuf, end);
// Process sbuf
// etc.
}
トムに感謝します。しかし、問題は、私がプラグを引いたときにread_until()がエラーコードを返さないということです。それは単にブロックし、決して戻ることはありません。 – Schnizz
これについて考えると、意味があると言いたいと思います。サーバー(受信ソケット)には、ワイヤの非アクティブと非正常的なシャットダウン接続を区別する方法がありません。ソケットで 'SO_RCVTIMEO'を設定するか、デッドラインタイマーの周りに非同期ラッパーを実装して、非同期読み取りを実行するio_serviceを停止することを検討します。いずれにしても、タイムアウトに関する外部情報が必要だと言います。つまり、受け入れられたTCP接続用に複数の「共有」ソケットを作成できるという完全な非同期化をお勧めします。 –
ええ、私は完全な非同期が問題を解決するかどうか疑問に思っていた。私はそれを与えるだろう。ヘルプをよろしくお願いいたします。 – Schnizz