SO_SNDBUF e SO_RCVBUF em soquetes do Linux
Estou programando um aplicativo de servidor cliente. Simplesmente, o servidor pode usar UDP ou TCP para cada cliente.
Eu quero que o cliente TCP e o cliente UDP imprimam o valor padrão paraSO_SNDBUF
eSO_RCVBUF
, mas estou surpreso quando imprimo o valor padrão para sndbuf e rcvbuf antes do estabelecimento da conexão, o valor é 0.
Nota: Estou usando o Ubuntu 12.10
Aqui está o meu código:
//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 */
Amostra de saída:
padrões: SO_RCVBUF = 0, MSS = 0
SO_RCVBUF = 9973 (depois de configurá-lo para 9973)
padrões: SO_SNDBUF = 0, MSS = 0
SO_SNDBUF = 9979 (depois de configurá-lo para 9979)
tcp_time nes411_server
A hora actual é (TCP): Seg Abr 22 23:40:46 2013
Após a conexão:
SO_SNDBUF = 170840, MSS = 16384