2015-11-18 30 views
3
int n = 0; 
if (0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n))) 
{ 
    printf("Get socket option failed, errno: %d\n",errno); 
} 
else 
{ 
    printf("Current socket buff len = %d\n", n); 
} 
n = 225280; 
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n))) 
{ 
    printf("setsock err errno %d\n", errno); 
} 
else 
{ 
    printf("setsock opt success\n"); 
} 
n = 0; 
if (0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n))) 
{ 
    printf("Get socket option failed, errno: %d\n",errno); 
} 
else 
{ 
    printf("After setting socket buff len = %d\n", n); 
} 

輸出是 -套接字緩衝區大小不增加

電流插座的buff LEN = 41600

setsock選擇成功

設置插座的buff後的len = 41600.

貌似收到緩衝區大小不增加,任何想法爲什麼發生這種情況?

在此先感謝!

+0

該平臺可自由調整實際值的向上或向下。 socket緩衝區沒有太大的意義。 – EJP

+0

@Coder:你可以分享linux內核版本和下列文件中的配置以便更好地展示圖片:/ proc/sys/net/ipv4/tcp_moderate_rcvbuf /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/core/rmem_default /proc/sys/net/core/rmem_max /proc/sys/net/ipv4/tcp_rmem –

回答

1

如果內核版本較新(2.6.17或更高版本),請通過驗證文件/ proc/sys/net/ipv4/tcp_moderate_rcvbuf來檢查是否啓用了自動調整功能。如果tcp_moderate_rcvbuf的值爲1,則啓用自動調整。在這種情況下,接收緩衝區將由內核動態更新,並綁定到/ proc/sys/net/ipv4/tcp_rmem中的值。檢查這個限制是否被打中。

如果內核版本較舊,請檢查SO_RCVBUF是否受到/ proc/sys/net/core/rmem_default和/ proc/sys/net/core/rmem_max中值的限制。請檢查/ proc/sys/net/ipv4/tcp_rmem的值

另請注意,'使用setsockopt()手動調整套接字緩衝區大小會禁用自動調整'。這裏是調整linux的好鏈接http://www.psc.edu/index.php/networking/641-tcp-tune