【发布时间】:2012-04-16 08:39:30
【问题描述】:
我知道我可以 cat /proc/sys/net/core/wmem_max 在套接字上获取 SO_SNDBUF 的最大大小,但是有没有一种简单的方法可以在 C 中查询该值,而无需经历笨拙的步骤打开文件,读取并转换为整数?
【问题讨论】:
我知道我可以 cat /proc/sys/net/core/wmem_max 在套接字上获取 SO_SNDBUF 的最大大小,但是有没有一种简单的方法可以在 C 中查询该值,而无需经历笨拙的步骤打开文件,读取并转换为整数?
【问题讨论】:
要获取 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);
【讨论】:
你不能在 shell 上调用 sysctl 命令(使用 system() 或 popen/pclose())来获得这个信息...至少避免打开文件,但在整体丑陋方面可能相当:
system("sysctl -n net.ipv4.tcp_wmem");
【讨论】:
fork() 时,准备一个execve()(即将命令/参数分解为单独的字符串)、open() 和read() 该命令文件(此处为/sbin/sysctl)然后加载所有依赖项(即.so 库)和popen() 您还可以创建一个FIFO 来在两个进程之间进行通信。绝对过分!