2

(これは、資格情報を失った古いアカウントで投稿された、以前に尋ねられた質問の更新された再投稿です)

クライアントが C++/winapi で、サーバーが C#/.net のクライアント サーバー プログラムを作成しています。

socket は AF_INET/ SOCK_STREAM であり、クライアントでソケット IO に Readfile() と WriteFile() を使用しています。

クライアントには、サーバーから読み取るループがあります(呼び出しスレッドをブロックする可能性があります [denote t1] 、これは私にとっては問題ありません)。また、タイムアウトで Event オブジェクトを待機する別のスレッド [t2 を示す] もあります。

タイムアウトに達した場合 (そしてイベントがまだシングル化されていない場合)、t2 スレッドは同じソケットに (正確にはバイト単位で) 書き込みます。

私が抱えている問題は、ソケットが全二重ではなかったかのように、t1 での読み取りが返されるまで書き込みが返されないように見えることです (一部の正当なシナリオでは、それは決して起こりません)。

隅から隅までチェックしましたが、他にスレッド関連の問題はありません。私は実際に別のマシンからクライアントを実行し、wireshark を使用してトラフィックを盗聴しました。タイムアウトに達した後、サーバー側からいくつかのデータを書き込むまで(どれだけ待っても)、ネットワーク上には何もありませんでした(したがって、t1のread()が返されました)-そしてその直後に、write()のクライアントが最終的に送信されます。

4

1 に答える 1

0

前の質問で説明したように、ソケット全二重です。あるスレッドでの読み取りは、別のスレッドでの書き込みをブロックしません。逆も同様です。

于 2013-05-29T15:17:38.560 に答える