Se vuoi vedere la dimensione del tuo buffer nel terminale, puoi dare un'occhiata a:
/proc/sys/net/ipv4/tcp_rmem
(per leggere)/proc/sys/net/ipv4/tcp_wmem
(per scrivere)
Contengono tre numeri, che rappresentano rispettivamente i valori minimo, predefinito e massimo della dimensione della memoria (in byte).
Mentre, come è stato sottolineato, è possibile vedere l'attuale predefinito dimensioni del buffer del socket in /proc
, è anche possibile controllarli utilizzando sysctl
(Nota:sebbene il nome includa ipv4, queste dimensioni si applicano anche ai socket ipv6:il codice ipv6 tcp_v6_init_sock() chiama semplicemente la funzione ipv4 tcp_init_sock()):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
Tuttavia, i buffer socket predefiniti vengono impostati solo quando il sock viene inizializzato, ma il kernel li dimensiona dinamicamente (a meno che non vengano impostati utilizzando setsockopt() con SO_SNDBUF). La dimensione effettiva dei buffer per i socket attualmente aperti può essere ispezionata usando ss
comando (parte del comando iproute
/iproute2
pacchetto), che può anche fornire molte più informazioni sui socket come il parametro di controllo della congestione ecc. Per elencare il TCP attualmente aperto (t
opzione) socket e memoria associata (m
) informazioni:
ss -tm
Ecco alcuni esempi di output:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.56.102:ssh 192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Ecco una breve spiegazione di skmem (socket memory) - per maggiori informazioni dovrai consultare i sorgenti del kernel (ad es. sock.h):
r:sk_rmem_alloc rb:sk_rcvbuf # current receive buffer size t:sk_wmem_alloc tb:sk_sndbuf # current transmit buffer size f:sk_forward_alloc w:sk_wmem_queued # persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
Per ottenere la dimensione del buffer nel programma c/c++ il seguente è il flusso
int n;
unsigned int m = sizeof(n);
int fdsocket;
fdsocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // example
getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
// now the variable n will have the socket size