1. ホーム
  2. c++

[解決済み] WSAEWOULDBLOCKエラーの解決方法

2022-02-09 19:22:17

質問内容

Win7のアプリケーションで、TCP接続で2つのクライアントにデータを送信しています。テストしている間、私は私が得ることを発見した WSAEWOULDBLOCK というエラーが頻繁に発生します。そのため このエラーを解決するために、例えばwhileループを組んでみました。

do  
{  
size_t value = ::send();  /*with proper arguments*/
}while(GetLastError() == 10035);

ということで、もし error 10035 データを再送信します。

しかし、このwhileループは時々無限に実行され、私のアプリケーションは停止します。 デッドロックのような状態になります。ソケットのサイズを大きくしてみましたが、まだ役に立ちません。

を解決する方法をご存知の方がいらっしゃいましたら、教えてください。 WSAEWOULDBLOCK のエラーについて教えてください。

解決方法を教えてください。

WSAEWOULDBLOCKは本当のエラーではなく、単に送信バッファが一杯であることを伝えるものです。これは、ネットワークを飽和させた場合や、相手側が単に受信データを確認しない場合に起こる可能性があります。select() 関数を見てください。バッファスペースが利用可能になるか、タイムアウトが発生するまで待つことができます。また、win32 イベントをストリームにバインドする方法もあり、これにより WaitForMultipleObjects で待ち時間を短くすることができます。

ところで、私は当初、あなたが「デッドロック」という言葉を使うことに反対したかったのですが、これも起こりうることなのです。もしあなたが次のリクエストを受け取る前に何らかのレスポンスを送信するのを待ち、相手側があなたのレスポンスを受け取る代わりに次のリクエストを送信しようとした場合、あなたのアプリケーションは事実上デッドロックに陥ります。select() を使用すると、データを送信できるのか、データを受信できるのか、あるいは接続に失敗したのかを判断することができます。これにより、これらのケースが発生した際に正しく処理することができます。

注:また、あなたのコードは、実際にはsocket()の呼び出しではなく、send/recvの呼び出しであると仮定しています。