3

これは、よくわからない非同期ソケットのシナリオです...クライアントソケットとサーバーソケットの2つのTcpソケットがあります。サーバーソケットがバインドされ、ポートでリッスンしています。

私のクライアント ソケットはサーバー ソケットに接続します (BeginConnect / EndConnect を使用)。次に、BeginSend() を使用してサーバーにメッセージを送信します。サーバー側では、Receive() や BeginReceive() は行いません。

何が起こるかというと、BeginSend 呼び出しに指定された AsyncCallback が呼び出され、その IAsyncResult が完了したことを通知し、Socket.EndSend() の呼び出しで例外が発生しないということです...

BeginSend 呼び出しが実際にサーバーに何かを送信した場合にのみ、AsyncCallback を呼び出してはならない、または呼び出すべきではないものがありますか (つまり、サーバーがすべてのバイトを受信した後に呼び出されるコールバック)? サーバーで受信が行われなかった場合、sendtimeout の期限が切れた後にコールバックを呼び出すべきではなく、Socket.EndSend への呼び出しで例外が発生しますか?

ありがとう

4

1 に答える 1

3

いいえ、TCP/IPがこれらすべてを処理します。接続の両側に、データを受信できるようになるまでデータを保持するバッファーがあります。バッファリングがないと、おしゃべりな通信を送信するときに恐ろしい遅延が発生する可能性があります。

手紙を郵送するようなものだと考えてください。郵便配達員がそれを受け取るまで、それはあなたの郵便受けにあります。それが発生すると、送信されます。まだ受け取っていません。転送中の場合もあれば、メールボックスで読み取りを待機している場合もあります。

したがって、BeginSendの後にコールバックを取得すると、それが送信されたことが通知されるだけです。反対側がデータを受信して​​処理したことを確実に知る唯一の方法は、しばらくの間、確認応答を要求することです。

于 2010-03-18T22:55:36.133 に答える