接收和发送缓冲区

这两天一直对Linux平台的TCP服务器进行压力测试,发现Linux平台在使用epoll的情况下,发送和接收的速度确实比完成端口的Windows服务器快一点,但消耗内存也大一些;由于没有设置过缓冲区大小,所以怀疑两个平台对socket设置的默认接收和发送缓冲区不同造成的,随后查询了网络上的资料,但对此问题都没有详细描述,只好自己进行了测试。
先对Windows平台进行了测试,具体的环境是WinXP+SP2,工具是.net 2003。在没有设置缓冲区大小的情况下,使用如下代码取得了默认缓冲区大小是8K。
  char acOptVal[4];
  int i = 4;
  getsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, acOptVal, &i);
  printf("WinXP getsockopt SOL_SOCKET SO_RCVBUF acOptVal:%d", atoi(acOptVal));
  getsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, acOptVal, &i);
  printf("WinXP getsockopt SOL_SOCKET SO_SNDBUF acOptVal:%d", atoi(acOptVal));
随后使用setsockopt函数对其他大小进行验证,确信取得缓冲区大小和设置的大小相同。
接着对Linux平台进行了测试,具体的环境是Linux内核2.6.9版本,工具是g++版本3.4.6。在没有设置缓冲区大小的情况下,使用如下代码取得了默认的接收和发送缓冲区大小分别是87380字节和16384字节。
  int iBufSize = 0;
  socklen_t ilen = 4;
  getsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, &iBufSize, &ilen);
  printf("Linux getsockopt SOL_SOCKET SO_RCVBUF iBufSize:%d", iBufSize);
  getsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, &iBufSize, &ilen);
  printf("Linux getsockopt SOL_SOCKET SO_RCVBUF iBufSize:%d", iBufSize);
通过和Windows平台比较缓冲区的大小:8+8比85+16,看来Linux默认情况下确实消耗的内存更多一些,也许这就是其TCP接收和发送数据快的原因吧。
但随后使用setsockopt函数验证Linux平台的getsocket函数,发生了更惊奇的事情:取得缓冲区大小和设置的大小不相同,接收和发送取得缓冲区大小都是设置大小的2倍。这是为什么呢?遍查了网络上的资料,只找到这个解释“Linux平台假设有一半的发送/接收缓冲区是用来处理内核结构, 因此系统控制的缓冲区是网络可访问的缓冲区的两倍。”如有那位高人知道更具体的解释,还希望给予赐教。
最终考虑消耗内存太大和接收速度的快慢,决定把Linux平台的接收、发送缓冲区都调整为16K(设置为8K),初步的测试没有发现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值