2016-06-23 12 views
0

TCP/IP接続ソケットに次のオプションを設定しました。 SO_SNDBUFとSO_RCVBUFオプションに設定された値は10240です。recvとsendコールに渡されるバッファサイズは1024です。完全なメッセージが転送されるまで、ソケットは呼び出しブロックを送受信しますか?

recvコールは返される前に常に1024バイトを待っていますか?送信者は、サイズが1024のパケットを送信します。

返送前に送信呼び出しが常に1024バイトを送信するのを待つのですか?

指定されたバイトを転送する前に、呼び出しが返されるのを防ぐための他のオプションを設定する必要がありますか?

setsockopt(*p_sockwk, SOL_SOCKET, SO_REUSEADDR, (void*)&reuseaddr, (socklen_t)sizeof(socklen_t)); 
    setsockopt(*p_sockwk, SOL_SOCKET, SO_SNDBUF, (void*)&sendbufsize, (socklen_t)sizeof(socklen_t)); 
    setsockopt(*p_sockwk, SOL_SOCKET, SO_RCVBUF, (void*)&recvbufsize, (socklen_t)sizeof(socklen_t)); 
    setsockopt(*p_sockwk, IPPROTO_TCP, TCP_NODELAY, (void*)&delay,  (socklen_t)sizeof(socklen_t)); 
+0

@ErikAlapää非常に役に立ちます。全体の本?なぜ最新版なの?以前のものは何が間違っていたのですか?お願いします。 – EJP

+0

@EJP質問をした人々がAPIとプロトコルの背後にある考え方を最小限に抑えようと試みても、迷惑になるだけです。本書では、以前のエディションはこれまでに書かれた最高のプログラミングブックの一部ですが、最新のものを使用すると、最新のものが提供されます。 ipv6とスレッド。 –

+0

@ErikAlapää書籍全体をお勧めすると、迷惑を軽減することができますが、実際にはこの質問に対する有益な回答ではありません。 – EJP

答えて

0

は、完全なメッセージが転送されるまでの呼び出しブロックを送信および受信ソケットのでしょうか?

TCPを使用していますが、TCPにはメッセージはありません。

TCP/IP接続ソケットに次のオプションを設定しました。 SO_SNDBUFとSO_RCVBUFオプションに設定された値は10240です。recvとsendコールに渡されるバッファサイズは1024です。

recvコールは返される前に常に1024バイトを待っていますか?

いいえ。これは記載されています。

送信者は、サイズ1024

無関係のパケットを送信します。

返送前に送信呼び出しが常に1024バイトを送信するのを待ちますか?

割り込みモードでは、割り込みが発生していない限り「はい」です。

指定されたバイトを転送する前に呼び出しが返されるのを防ぐために、他のオプションを設定する必要がありますか?

ありません。

setsockopt(*p_sockwk, SOL_SOCKET, SO_REUSEADDR, (void*)&reuseaddr, (socklen_t)sizeof(socklen_t)); 

送信または受信とは関係ありません。

setsockopt(*p_sockwk, SOL_SOCKET, SO_SNDBUF, (void*)&sendbufsize, (socklen_t)sizeof(socklen_t)); 
setsockopt(*p_sockwk, SOL_SOCKET, SO_RCVBUF, (void*)&recvbufsize, (socklen_t)sizeof(socklen_t)); 

これらは、デフォルトよりも大きく設定しますが、お望みの動作には影響しません。

setsockopt(*p_sockwk, IPPROTO_TCP, TCP_NODELAY, (void*)&delay,  (socklen_t)sizeof(socklen_t)); 

これは役立つかもしれませんが、保証はありません。

読み込み時にバッファを埋めるには、ループする必要があります。

関連する問題