1

winsock の send() または WSASend() を使用して送信されたデータが本当に宛先に配信されているかどうかを確認する方法はありますか?

サードパーティのサーバーと通信するアプリケーションを作成していますが、しばらく作業した後にダウンすることがあり、そのサーバーに送信されたメッセージが配信されるかどうかを確認する必要があります。問題は、サーバーが既にダウンしている場合でも send() の呼び出しがエラーなしで終了し、次の send() のみがエラーで終了することがあるため、前のメッセージが配信されたかどうかわかりません。

TCPレイヤーには、送信された特定の(またはすべての)パケットが確認応答されたかどうかの情報があると思いますが、ソケットインターフェイスを使用して利用できない(または方法が見つかりません)。

最悪なことに、サーバーのコードを変更できないため、配信確認メッセージを受け取ることができません。

4

2 に答える 2

0

send() への戻りからではありません。send() が言うのは、データが送信バッファにプッシュされたことだけです。接続されたソケット ストリームは、すべてのデータを送信することが保証されているわけではありません。そのため、 send() が単一のパケットで実行される、またはネットワークの遅延や中断が原因で発生するかどうかを想定することはできません。

完全な承認が必要な場合は、より高いアプリケーション レベルの ack (パケット ACK だけでなく、フォーマットされた ack メッセージを返すサーバー) を確認する必要があります。

于 2011-01-26T22:39:35.887 に答える
0

申し訳ありませんが、あなたが達成しようとしていることを考えると、TCP スタックが特定のバイトセットがリモート TCP スタックによって ACK されたことを示すことができたとしても、実際にはそうではないことを認識する必要があります。あなたが現時点で知っていることとは何か違うことを意味します。

問題は、リモート アプリケーションが送信したデータを処理した後にのみ送信される、リモート アプリケーションからのアプリケーション レベルの ACK がない限り、データがリモート アプリケーションによって受信されたかどうかを確実に知ることができないことです。 .

「しかし、十分に近いと推測できます」

妄想ばかりです。送信がほぼ有効であるため、送信が完了した場合、その仮定を行うこともできます。

問題は、TCP スタックが、リモート スタックがデータ (1) に ACK を送信したことを通知できたとしても、それはデータを受信するリモート アプリケーション (2) と同じではなく、リモート スタックと同じではないことです。アプリケーションが実際にデータを使用している (3)。

リモート アプリケーションが任意の時点でクラッシュする可能性があることを考えると、データが到着したことを示す価値のある唯一の兆候は、データが意図した目的で使用された後にリモート アプリケーションによって送信されたものです。

それ以外はただの希望的観測です。

于 2011-01-27T08:28:43.533 に答える