4

boost::asio::ip::tcp::socket関連する書き込み機能について質問があります。TCP に関するウィキペディアの記事を読むと、TCP には確認メッセージとチェックサムが含まれていることがわかります。残念ながら、これに関する情報はboost::asioのリファレンスでは見つかりません。私が理解している限りでは、boost::asio は TCP の OS 実装を使用しており、これには両方の機能が含まれている必要があります。

私の質問は、で呼び出されたときに関数boost::asio::writeまたはboost::asio::async_write保証を行うものですboost::asio::ip::tcp::socket。関数が返された場合、またはコールバック関数がエラーなしで呼び出された場合、それはどういう意味ですか。いくつかの可能性を想像できます:

  1. 基本的に何もありません。プログラムがOSにデータを送信するように指示したことを意味するだけで、それ以上のことはありません。
  2. データは進行中です。これは、OS がデータを送信したことを認識したことを意味します。
  3. データが到着しました。つまり、相手側からの確認メッセージが受信されました。
  4. 3. と同じように、データが到着し、破損していません。さらに、チェックサムが加算されます。

4 でない場合、boost::asio を使用してこれを強制する方法はありますか (自分で実装するのではなく、boost::asio 内で意味します)。

4

2 に答える 2

3

それは#1であり、それが本来あるべき姿です。データが送信される保証はありません。

あなたは#4が欲しいと思いますが、実際にはそうではありません。リモートピアのネットワークスタックが正しいデータを受信したという事実は、おそらくアプリケーションとは無関係です。データが正しく受信および処理されたかどうかを本当に知りたいのですが、これはTCPの範囲を超えていますが、TCP上に実装するのは簡単です。(TCPで期待できることの概要については、 OSIモデルを読むことをお勧めします。基本的には、データが適切なアプリケーションまたはそれ以上に到達することを確認する必要があります。TCPは、データがアプリケーションが実行されているコンピューター。)

必要なことを行うには、TCPリンクを介して帯域内確認応答を送信します。SHA-2またはその他のデータのハッシュを確認応答に入れることもできます。データが処理されるまで確認応答の送信を待つこともできます。たとえば、データがディスクに書き込まれfsync()て呼び出されるまで待ちます。

于 2013-01-18T05:44:03.677 に答える
2

ローカルで検出されたエラーが報告されます。接続エラーも報告されます。TCP を使用している場合、tcp-ack の失敗が報告されますが、後で読み取りまたは書き込みの呼び出しで発生する可能性があります (OS に tcp-hack の失敗が通知されたとき)。

そのため、書き込みを発行したときに実際に受信されたことを確認することはできません。no write error は、使用している tcp 接続に現在エラーがないことを OS が認識しており、データを内部でバッファリングして tcp ピアに送信したことを意味します。

于 2013-01-18T12:24:54.673 に答える