• 締切済み

recv 受信

送信データが 1500BYTE以上の場合、recvで完全な受信ができない場合、どんな対策が御座いますか?教えて下さい. 因みに、recvは以下のように実行しています. recv(sock, bBuf, size, 0);

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

>そもそも, recv(sock,bBuff, nMaxSize, 0);の中<<flag 0>>の意味合いを理解していないです。 もしかして「<<flag 0>>の意味合いを理解していないです。」は 「第4引数に0を指定している意味がわからない」ではなくて 「第4引数が何をするものなのかがわからない」なんでしょうか。 仮にそうであったとしても「man recvを読んで理解してください」には変わりませんが。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>>>「何のフラグも指定していない。」ただそれだけ。 >recvの flag 0の意味がないというでしょうか? 誰が意味がないといってるんですか? 「何も指定していない」と書いてるんですが。 man recv でフラグに指定できるものの効果調べてますか? 何も指定してないわけだから、それらの効果が何もないというだけのことです。 >Linux の環境で、以下の実行方式では、受信結果が違ってくることを確認していますが 異なったフラグを指定してるわけですから違って当たり前だと思いますけど・・・

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>送信側は他社なので、当方は決めないです。 そういう事でしたら、まず送受信手順をその「他社」に確認すべきだと思いますが。 >そもそも, recv(sock,bBuff, nMaxSize, 0);の中<<flag 0>>の意味合いを理解していないです。 「何のフラグも指定していない。」ただそれだけ。 基本的にはデータの終わりまでrecvを繰り返してバッファリングしていくだけです。 データの終わりをどう判断するかは先にも書きましたが「他社」に確認してください。 送信側がデータ送信終わったらshutdownするという通信仕様なら以下のような感じ。 動作確認等はしてないので間違いはあるかもしれません。 struct rbuf { char buf[4096]; int len; struct rbuf *next; }; struct rbuf *rbuf_list = NULL; struct rbuf **next = &rbuf_list; int rv = 0; struct rbuf *rb = NULL; for (;;) { if (rb == NULL) { rb = malloc(sizeof(*rb)); rb->next = NULL; } rv = recv(sock, rb->buf, sizeof(rb->buf), 0); if (rv == -1) { if (errno == EINTR) continue; // エラー処理 exit(1); } if (rv == 0) { free(rb); break; } rb->len = rv; *next = rb; next = &rb->next; rb = NULL; }

nishiyama3721
質問者

お礼

ご親切な回答、どうもありがとうございました。 >>「何のフラグも指定していない。」ただそれだけ。 recvの flag 0の意味がないというでしょうか? Linux の環境で、以下の実行方式では、受信結果が違ってくることを確認していますが ////////////////// recv(sock,bBuff,nSize,MSG_WAITALL); recv(sock,bBuff,nSize,MSG_DONTWAIT); ////////////////// よろしくお願い致します.

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>受信のBYTE数が決まっていないです。 送受信データの先頭にデータ長を含めるなり、 終端と判断できるようなデータを付加するなりしてください。 もしくは送信側で送信をshutdown(closeではない)することを前提に、recvできるだけ繰り返す。 もし上記の手段が取れないというのでしたら無理なので諦めましょう。

nishiyama3721
質問者

お礼

ご回答、どうもありがとうございました。 送信側は他社なので、当方は決めないです。 以上よろしくお願い致します. 張

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

1500バイトとか関係なく、recvで受信できるバイト数は受信してみないとわからないので、 Nバイト受信したいのであれば、合計受信バイトがNになるまで、recvをループして繰り返します。 for(n=0; n<N; n+=recv(sock, bBuf+n, N-n, 0)) ; とかかな。 あるいは、fdopen()して、fread()すれば、EOFかエラーにならない限り指定サイズ読めるはず。

nishiyama3721
質問者

お礼

ご回答、どうもありがとうございました。 受信のBYTE数が決まっていないです。 以上よろしくお願い致します. 張

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

そもそも一度のrecvで全データ受信できるとは限らないんですけど。 全データ受信できるまでrecv繰り返してください。

nishiyama3721
質問者

お礼

ご回答、どうもありがとうございました。 受信のBYTE数が決まっていないです。 そもそも, recv(sock,bBuff, nMaxSize, 0);の中<<flag 0>>の意味合いを理解していないです。 全て受信完了まで、以下のようにもできますが recv(sock, bBuff, nSize, MSG_WAITALL); しかし、相手の送信長さ(nSize)が事前に分からない場合、使えるはずないです。 因みに、環境はLinuxです よろしくお願い致します. 張