2016-09-29 9 views
-1

これは質問よりも確認のためのリクエストです。 (私は自分のPCから離れているので、このソリューションを実装してテストすることはできません)。C++ソケットバッファーサイズ

私は、webcam(メタデータと共に)で撮影した画像ファイルをraspberryPiから私のPCに送るプログラムを書いています。

私は、イメージは約130kb、パケットヘッダーは12b、それに関連するメタデータは24bです。私は将来像のサイズを増やすことができますが、いったん動作するプロトタイプがあれば。

現在のところ、私はこの完全なパケットを正常に取り出すことができません.PCに送信した後、バッファ内に約64kbのrecv'dしか取得できません。

SOCKET sock = socket(PF_INET, SOCK_STREAM, 0); 

が64キロバイトである(あなたが「知っている中で」なら、誰かがこれを明確にできてください)

私はこれが原因でソケットのデフォルトのバッファサイズは次のように宣言した何らかの理由であると仮定しています

この問題を解決するために、setsockopt(x ..)コマンドを使用してソケットサイズを1024kbに増やしたいと考えています。

私の問題の診断と提案された解決策が正しいことを誰かが確認できますか?

私は今すぐ自分のPCを形成しているので、家に帰るまで試してみることができません。

+0

もう一つの選択肢は、私が精神的にプライミングしているのは、手動でパケットをセグメント化することです。しかし、これは、エラーの可能性がはるかに高くなり、各セグメントごとにヘッダーを送信して読み取る必要があるため、全体的なパケットサイズ/計算時間が増えると思われます。 –

+0

すべてのデータを受け取っていないのは、 'recv()'がループする代わりにあなたのバッファを埋めると仮定しているということです。その前提を裏付けるものはドキュメントには何もありません。 – EJP

+0

返信ありがとう、私はあなたに従うことを確信していないが、明確にする:私はそれがヘッダーに格納され、これが抽出され、読み取り、残りの部分を受け取るために割り当てられた適切なサイズのバッファですデータ。 だから、これ以上の説明で: >>は、データパケットのサイズ で、ヘッダを取得し、正しいサイズ のバッファを作成します>バッファを満たすと作るために実行したrecvはバイトのノートが を受けた>チェックバイトは、ヘッダのデータサイズに対して受信しました –

答えて

0

これはおそらくソケットバッファとは関係ありませんが、recv()send()は、必要なすべてのデータを送受信する必要はありません。これらの関数呼び出しの戻り値を確認します。実際に送受信されたバイト数を示します。

「短い」に対処するための最良の方法は、/はそうのように、ループ内でそれらを置くことです読み書き:

char *buf; // pointer to your data 
size_t len; // length of your data 
int fd;  // the socket filedescriptor 

size_t offset = 0; 
ssize_t result; 
while (offset < len) { 
    result = send(fd, buf + offset, len - offset, 0); 
    if (result < 0) { 
    // Deal with errors here 
    } 
    offset += result; 
} 

がデータを受信するための同様の構造を使用してください。考えられるエラー条件の1つは、関数呼び出しが中断されたことです(errno = EAGAINまたはEWOULDBLOCK)。その場合はsendコマンドを再試行する必要があります。それ以外の場合はループを終了する必要があります。

+0

ありがとう@ G.Sliepen。だから、私はあなたがループで送信しているので、受信側では、ループrecvを使用しなければならないことを示唆してください(そうでなければ私を修正してください)を参照してください。無関係のプログラムからポートに送信される付随パケットのように、意図しないデータを受信することに対する保護は何ですか?私がこれを行うと考えることができる唯一の方法は、その中に '20の部分10'のIDを持つヘッダを入れることです。これはより多くの問題を作成していないようですか?私の主な質問は、私が送信する/ recvを使用する内部システムバッファのサイズを増やせばいいのではないかと思いますか?つまりsetsockopt ... –

+0

はい、受信側で受信ループを使用する必要があります。 TCPソケット(あなたが使用していると仮定している)は、常に単一の接続からの順序付けられたデータストリームを提供します。したがって、無関係のネットワーク接続からの偽のデータは受信されず、すべてのデータが送信されるのと同じ順序で受信されます。 –