0

asio を使用しているときに発生する特有の問題を理解するための助けが必要です。

私はクライアントサーバーアプリを持っており、C ++クライアント(boost asioを使用)が2バイトのハートビート(たとえば、毎秒)をサーバー(Javaで記述)に送信します(大量のデータも受信します)。

かなりの数分間、サーバーは2バイトのハートビートを正しく受信しますが、その後、サーバーの「読み取り」は0バイトの読み取りを訴え、接続を閉じます(ブロッキング読み取りでは正しいと思います)。ただし、クライアントは常に正しい金額を転送していることを出力します。

私は、関数の「書き込み」ファミリのほぼすべてのバリアントを試しました。それらはすべて「write_some」に関して実装されていますか?それは、この動作が期待されていることを意味しますか?

基本的に、asio内で書き込み(少なくとも1バイト)を保証するものを探しています。どこが間違っているのかを理解するのを手伝ってください(さらに情報が必要な場合)...アドバイス、大歓迎です!ありがとう!

4

2 に答える 2

1

ソケットの場合、「書き込みを保証する」ことはできません。ネットワークがダウンしたり、ケーブルが引っ張られたり、スイッチに火がついたり、世界中で電源が切れていて、たまたまバッテリで動作しているコンピュータが 1 台だけだったりした場合はどうなるでしょうか。

とは言っても、おそらく何らかのバッファリング/空の問題があるように思えます。読み取りコードをチェックして、表示されるすべてのデータを実際に消費していることを確認してください。

0 バイトの読み取りはエラーではありません。そのコードをもう一度調べて、ソケットのエラー ステータス フラグを確認してください。読み取りは「AGAIN」ステータスで失敗する可能性があります。これは、再試行する必要があることを意味します。

于 2009-07-06T08:52:52.160 に答える
1

strace両端のアプリケーション。read ()、write () などによって返されるエラー コードが表示されますstrace -f。アプリケーションがマルチスレッドの場合に使用します。

このアプローチの利点は、すべてのアプリケーション (Java、C++、Python) がstraceで同じように見えるため、悪い動作を簡単に見つけられることです。

この場合、おそらく tcp 接続が (正常に) 終了したことが示されます。

于 2009-12-15T13:01:50.117 に答える