4

C++ でアプリケーションを開発していますが、ブースト ソケットに問題があります。サーバーは画像を送信しますが、すべてのバイトがクライアントによって受信されるわけではありません。クライアントは常に、サーバーが送信したよりも約 500 バイト少なく受信します。以下に、関連するコードと実行中のプログラムのスクリーンショットを示します。

サーバーコード:

int sent = boost::asio::write(*socket, response, boost::asio::transfer_all(), error);
std::cout << "Sent: " << sent << std ::endl;

クライアント コード (サーバーから送信された合計バイト数が 10000 で割り切れる場合、read_some がブロックされることはわかっています。このコードはテスト用です):

int len = 0;
int count = 0;
do {
    len = socket->read_some( boost::asio::buffer( imageData, 10000 ) ); 
    count += len;
    std::cout << "len: " << len << std::endl;
    std::cout << "count: " << count << std::endl;
} while(len == 10000);

std::cout << "Image Received of size: " << count << std::endl;

サーバーのスクリーンショット: サーバーのスクリーンショット

クライアントのスクリーンショット: クライアントのスクリーンショット

御時間ありがとうございます; どんな助けや提案も大歓迎です。

4

1 に答える 1

7

10000 バイトの完全なバッファを受け取る保証はありません。

次のアプローチをお勧めします。

明示的なターミネータなしでバイナリ データを送信するには、まずそのサイズを送信し、次にデータ自体を送信します。この場合、クライアントは、このチャンクで受け取るべきデータの数を認識します。

于 2013-01-24T09:38:18.460 に答える