2012-04-02 102 views
1

我知道我可以通過cat/proc/sys/net/core/wmem_max來獲取套接字上SO_SNDBUF的最大大小,但是有沒有一種簡單的方法可以在C中查詢這個值,而不需要通過開啓感覺的步驟該文件,閱讀,並轉換爲一個整數?在外殼查詢C中的最大套接字發送緩衝區大小?

+0

據我所知這是唯一的方式獲得當前剩餘的緩衝區。 – 2012-04-02 17:20:30

回答

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); 
0

你們能不能調用的sysctl命令(使用系統()POPEN/pclose函數())來獲取這些信息......至少避免了打開一個文件,但可能相當於在整體的醜陋:

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