情報が見つからないWindowsソケットのイライラする動作が発生しているので、ここで試してみようと思いました。
私の問題は次のとおりです。
デバイス ドライバーとして機能する C++ アプリケーションがあり、シリアルから TCP/IP へのコンバーターを介して接続されたシリアル デバイスと通信します。シリアル プロトコルでは、デバイスとソフトウェアの間で通信するために、多くのシングル バイト メッセージが必要です。これらの小さなメッセージは、起動後に約 3 回しか送信されず、その後は実際には送信されないことに気付きました (wireshark で確認)。その間ずっと、send() メソッドは > 0 を返し続け、メッセージが送信バッファにコピーされたことを示します。ブロッキングソケットを使用しています。
この問題を発見したのは、この特定のドライバーは、送信バッファーが完全にいっぱいになると最終的に接続を切断する必要があるためです (select() は約 5 時間後にこれが原因で失敗しますが、SO_SNDBUF サイズを減らすとはるかに早く発生します)。
確認したところ、2 バイト以上のメッセージで send を呼び出すと、送信が失敗しないことがわかりました。
どんな意見でも大歓迎です。これを修正する方法がわかりません。