您的位置:首页 > 其它

关于SOCKET 接收发送 缓冲区 测试 SO_SNDBUF

2015-09-17 18:44 316 查看
一直以来对网络都很感兴趣

今天对SOCKET的发送接收缓冲区做了测试

测试过程 文字描述如下

服务端 伪代码

g_ListenSock2 =socket(AF_INET,SOCK_STREAM,0);

然后bind

然后 listen(g_ListenSock2

然后设置了发送缓冲与接收缓冲大小

int nSize = 1000*512;

setsockopt(g_ListenSock2,SOL_SOCKET,SO_RCVBUF,(char*)&nSize ,sizeof(int));

setsockopt(g_ListenSock2,SOL_SOCKET,SO_SNDBUF,(char*)&nSize ,sizeof(int));

然后开启线程,在线程里accept 阻塞调用

客户端代码 简单 创建SOCKET 然后连接服务 也为阻塞socket 客户端得到的默认接收缓冲区大小为65536 也就是64K

当客户端连接到服务端时,int nLen = sizeof(int);

在服务端accept后,返回g_ClientSock 我们的到g_ClientSock的接收缓冲 结果为512000 也就是 服务端的监听套接字的缓冲大小,多次测试总结出 其缓冲区大小继承了监听套接字的缓冲区大小 结果nDefRecvBufSize = 512000

getsockopt(g_ClientSock,SOL_SOCKET,SO_RCVBUF,(char*)&nDefRecvBufSize,&nLen);

在另外的按钮消息响应函数里 我们发送数据,个人以前一直以为 我客户端不接收的情况下 服务端最多也就能发送设置的缓冲区大小的字节,这里即也就是最多能发送512000字节,

可测试结果大跌眼镜

当我第一次发送数据小于512000时,第二次是完全可以发送512000大小的,测试发现 第一次发送缓冲区大小为1--511999(512000-1)时,第二次调用总是能发送成功512000字节大小,测试环境为win8 vs2010。客户端一个字节也不接收,也就是说这时候服务端第一次发送小于设定缓冲区大小时,第二次完全可以发送缓冲区大小数据的。

在异步下做测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: