2

クライアントサーバーアプリケーションをプログラミングしています。簡単に言うと、サーバーはクライアントごとに UDP または TCP のいずれかを使用できます。

TCP クライアントと UDP クライアントの両方で と のデフォルト値を出力したいのですが、接続が確立される前に sndbuf と rcvbuf のデフォルト値を出力するSO_SNDBUFSO_RCVBUF、値が 0 であることに驚きました。

:Ubuntu 12.10を使用しています

これが私のコードです:

//assume all variables initialized correctly.

/* SO_RCVBUF options */

len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
len = sizeof(mss);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
printf("defaults: SO_RCVBUF = %d, MSS = %d\n", rcvbuf, mss);

rcvbuf = 9973;      /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
printf("SO_RCVBUF = %d (after setting it to 9973)\n\n\n\n", rcvbuf); 


/* SO_RCVBUF options */


/* SO_SNDBUF options */

len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
//len2 = sizeof(mss2);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss2, &len2);
printf("defaults: SO_SNDBUF = %d, MSS = %d\n", sndbuf, mss2);

sndbuf = 9979;      /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf));
len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
printf("SO_SNDBUF = %d (after setting it to 9979)\n", sndbuf);

/* SO_SNDBUF options */

出力例:

デフォルト: SO_RCVBUF = 0、MSS = 0

SO_RCVBUF = 9973 (9973に設定後)

デフォルト: SO_SNDBUF = 0、MSS = 0

SO_SNDBUF = 9979 (9979に設定後)

tcp_time nes411_server

現在の時刻 (TCP): Mon Apr 22 23:40:46 2013

接続後:

SO_SNDBUF = 170840、MSS = 16384

4

2 に答える 2

4

明らかに、送信バッファと受信バッファは、呼び出し前ではないときに割り当てられますconnect(),。リッスンにソケットを使用しようとしている可能性があります。その場合、両方のバッファがスペースを完全に浪費します。または何もない、同上。

注意: なぜ素数を使用しているのですか? バッファ サイズには 2 のべき乗を使用するのが通例です。

于 2013-04-22T21:58:27.217 に答える