Как найти размер буфера сокета linux - программирование
Подтвердить что ты не робот

Как найти размер буфера сокета linux

Каков размер буфера сокета по умолчанию для linux? Есть ли команда, чтобы увидеть это?

4b9b3361

Ответ 1

Если вы хотите увидеть размер вашего буфера в терминале, вы можете посмотреть:

  • /proc/sys/net/ipv4/tcp_rmem (для чтения)
  • /proc/sys/net/ipv4/tcp_wmem (для записи)

Они содержат три числа, которые являются минимальными, стандартными и максимальными значениями размера памяти (в байтах) соответственно.

Ответ 2

Для получения размера буфера в программе c/С++ следующим является поток

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

Ответ 3

Хотя, как было указано, в /proc можно увидеть текущие размеры буфера сокетов по умолчанию, но также можно проверить их с помощью sysctl (Примечание: хотя имя включает ipv4, эти размеры также применяются к сокетам ipv6 - код ipv6 tcp_v6_init_sock() просто вызывает функцию ipv4 tcp_init_sock()):

 sysctl net.ipv4.tcp_rmem
 sysctl net.ipv4.tcp_wmem

Однако буферы сокетов по умолчанию просто устанавливаются при инициализации sock, а затем ядро динамически изменяет их размеры (если не установлено с помощью setsockopt() с SO_SNDBUF). Фактический размер буферов для открытых в данный момент сокетов может быть проверен с помощью команды ss (часть пакета iproute), которая также может предоставить гораздо больше информации о сокетах, таких как параметр управления перегрузкой и т.д. Например. Чтобы просмотреть список открытых в настоящее время сокетов TCP (опция t) и связанную с ними память (m):

ss -tm

Вот пример вывода:

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)

Вот краткое объяснение skmem (памяти сокетов) - для получения дополнительной информации вам нужно взглянуть на исходные коды ядра (например, 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

Ответ 4

Хотя, как уже было отмечено, в /proc можно увидеть текущие размеры буфера сокетов по умолчанию, но также можно проверить их с помощью sysctl (Примечание. Хотя имя включает ipv4, эти размеры также применяются к сокетам ipv6 - ipv6). Код tcp_v6_init_sock() просто вызывает функцию ipv4 tcp_init_sock()):

 sysctl net.ipv4.tcp_rmem
 sysctl net.ipv4.tcp_wmem

Однако буферы сокетов по умолчанию просто устанавливаются при инициализации sock, а затем ядро динамически изменяет их размеры (если не установлено с помощью setsockopt() с SO_SNDBUF). Фактический размер буферов для открытых в данный момент сокетов можно проверить с помощью команды ss (часть пакета iproute). Например, для просмотра списка открытых в настоящее время сокетов TCP (t option) и информации о связанной памяти (m):

ss -tm

Вот пример вывода:

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)

Вот краткое объяснение skmem (сокет памяти) - для получения дополнительной информации вам нужно взглянуть на исходные коды ядра (например, 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

Ответ 5

Атомный размер - 4096 байт, максимальный размер - 65536 байт. Sendfile использует 16 каналов размером 4096 байт. cmd: ioctl (fd, FIONREAD, & buff_size).