Запрос максимального размера буфера отправки сокета в C? - PullRequest
1 голос
/ 02 апреля 2012

Я знаю, что могу с помощью cat / proc / sys / net / core / wmem_max получить максимальный размер для SO_SNDBUF в сокете, но есть ли простой способ запросить это значение в C, не выполняя пошаговых шаговоткрытие файла, чтение и преобразование в целое число?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

Чтобы получить значение sysctl net.ipv4.tcp_wmem, вам нужно проанализировать его из файла / proc, представляющего этот sysctl (лучшего способа в Linux нет, а системный вызов sysctl давно устарел .)

Что-то вроде:

unsigned long wmem_min,wmem_default,wmem_max;
FILE *f = fopen("/proc/sys/net/ipv4/tcp_wmem", "r");
if(f == NULL)
   fail();
if(fscanf(f, "%lu %lu %lu", &wmem_min,&wmem_default,&wmem_max) != 3)
  fail();

fclose(f);
 ... use wmem_max

Для конкретного сокета вы можете получить текущий оставшийся буфер с помощью

  socklen_t optlen;
  int send_buf, rc;
  optlen = sizeof(send_buf);
  //if getsockopt is successful, send_buf will hold the buffer size
  rc = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &send_buf, &optlen);
0 голосов
/ 02 апреля 2012

Не могли бы вы вызвать команду sysctl на оболочке (используйте system () или popen / pclose () ) для получения этой информации .. . По крайней мере, избегает открытия файла, но может быть эквивалентен по общему уродству:

system("sysctl -n net.ipv4.tcp_wmem");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...