および構造体WSASendに関連付けられているソケットを使用して呼び出すと、データをネットワーク スタックに効果的に渡して送信できます。使用したデータ バッファーがネットワーク スタックで不要になると、ネットワーク スタックは "完了" を返します。その時点で、データ バッファーに使用されているメモリを自由に再利用または解放できます。IOCPOVERLAPPED
完了が生成された時点でデータがピアに到達している可能性は低く、完了の生成は、ネットワーク スタックがバッファの内容の所有権を取得したことを意味するだけであることに注意してください。
これはsend操作方法が異なります。sendブロッキング モードでは、指定したすべてのデータがネットワーク スタックで使用されるまで、 への呼び出しがsendブロックされます。ノンブロッキング モードでの呼び出しの場合send、ネットワーク スタックはバッファからできるだけ多くのデータを取得し、使用量の詳細を返します。これは、データの一部が使用されたことを意味します。ではWSASend、通常、通知される前にすべてのデータが使用されます。
WSASendリソースの制限やネットワーク エラーが原因で、オーバーラップが失敗する可能性があります。すべてではなく一部のデータが送信されたことを示すエラーが発生することはまれです。通常、すべて正常に送信されるか、まったく送信されません。ただし、すべてではなく一部のデータが使用されたことを示すエラーで完了を取得することは可能です。この時点からどのように進めるかは、エラー (一時的なリソース制限またはハード ネットワーク障害) とWSASend、そのソケットで保留中の の数 (ゼロまたはゼロ以外) によって異なります。一時的なリソース エラーがあり、他に未解決のエラーがない場合にのみ、残りのデータを送信してみてください。WSASendこのソケットを呼び出します。これは、一時的なリソース制限の状況がいつ通過するかわからないという事実によって、より複雑になります...一時的なリソース制限によって部分的な送信が引き起こさWSASendれ、保留中の他の呼び出しがある場合は、おそらく中断する必要がありますこのWSASend呼び出しからバッファの一部を送信してから、後続の呼び出しのすべて (または一部) を送信することにより、データ ストリームを文字化けした可能性があるためですWSASend。
WSASendソケットで複数の呼び出しを未処理にすることは、a) 有用であり、b) 効率的であることに注意してください。これが、接続を最大限に活用する唯一の方法です。WSASendただし、一度に複数のオーバーラップした呼び出しを保留することによるメモリとリソースの使用量の影響に注意する必要があります(ここを参照)。これは、バッファの有効期間 (したがって、メモリとリソースの量) の制御を効果的に処理しているためです。 TCP フロー制御の問題により、コードはピアに) を使用します)。ほらSIO_IDEAL_SEND_BACKLOG_QUERY、SIO_IDEAL_SEND_BACKLOG_CHANGE本当に賢くなりたいなら...