在C中查询最大套接字发送缓冲区大小?

时间:2012-04-02 17:03:15

标签: c linux sockets

我知道我可以使用cat / proc / sys / net / core / wmem_max来获取套接字上SO_SNDBUF的最大大小,但有一种简单的方法可以在C中查询该值,而无需经历kludgy感觉的步骤打开文件,读取并转换为整数?

2 个答案:

答案 0 :(得分:2)

要获取net.ipv4.tcp_wmem sysctl的值,您需要从表示该sysctl的/ proc文件中解析它(在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);

答案 1 :(得分:0)

你无法在shell上调用 sysctl 命令(使用 system() popen / pclose())来获取此信息信息......至少可以避免打开文件,但可能与整体丑陋相同:

system("sysctl -n net.ipv4.tcp_wmem");