1

次のWSASend呼び出しを投稿するとします(コールバック関数のないWindows I / O完了ポート):

void send_data()
{
    WSABUF wsaBuff[2];
    wsaBuff[0].len = 20;
    wsaBuff[1].len = 25;
    WSASend(sock, &wsaBuff[0], 2, ......);
}

完了ポートから「write_done」通知を受け取った場合、wsaBuff [1]は完全に(25バイト)送信されますが、wsaBuff [0]は部分的にのみ(たとえば7バイト)送信される可能性はありますか?

4

2 に答える 2

2

前に述べたように、他の非常によく似た質問の1つへの回答で、これが失敗する可能性があるのは、リソースが少ない状況(ページングされていないプールまたはロックされたページ制限の問題である可能性が最も高い)でのみです。 ENOBUFSの部分的な完了とエラーの戻り。繰り返しになりますが、前に述べたように、IOCP開発作業の10年間で、これを本番環境での問題と見なしたことはありません。システムを完全にテストするストレステストを行っている状況でのみです(文字通り、ページングされていない場合もあります)。プールが使い果たされると、動作の悪いドライバーがボックスをブルースクリーンすることがあります)。

障害をログに記録するコードを追加し、ソケットを閉じるだけで、障害の可能性に対処し、先に進むことができるようにすることをお勧めします。あなたの失敗処理コードが実行されたら、私は驚きます。しかし、それが正しいかどうかを確信でき、問題を再現できれば、本当にそれをより適切に処理する必要があるかどうかを考えるためにより多くの時間を費やすことができます。

于 2010-06-17T09:43:12.480 に答える
0

オーバーラップしたソケットIOを実行するためWSASendの推奨される方法であるため、不完全なときに完了した場合は意味がありません。完了通知/ルーチン/イベントは、アプリケーションが使用済みの構造をクリーンアップ/リサイクルする唯一の方法です。

また、いいえ、それは不可能WSASendです。使用されているバッファーに関係なく、単一の呼び出しは単一のIO呼び出しのままです。

于 2010-06-17T08:19:02.503 に答える