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