【问题标题】:Querying maximum socket send buffer size in C?在C中查询最大套接字发送缓冲区大小?
【发布时间】:2012-04-16 08:39:30
【问题描述】:

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

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    要获取 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);
    

    【讨论】:

      【解决方案2】:

      你不能在 shell 上调用 sysctl 命令(使用 system()popen/pclose())来获得这个信息...至少避免打开文件,但在整体丑陋方面可能相当:

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

      【讨论】:

      • 哈!哈!当您运行另一个命令fork() 时,准备一个execve()(即将命令/参数分解为单独的字符串)、open()read() 该命令文件(此处为/sbin/sysctl)然后加载所有依赖项(即.so 库)和popen() 您还可以创建一个FIFO 来在两个进程之间进行通信。绝对过分!
      猜你喜欢
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2011-12-16
      • 1970-01-01
      • 2015-05-01
      相关资源
      最近更新 更多