首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

Socket中Recv耗时很长,拥塞

2012-09-17 
Socket中Recv耗时很长,阻塞C/C++ codechar *pBuf new char [1024w获取次数:5Recv耗时:5289ms当我把缓存大

Socket中Recv耗时很长,阻塞

C/C++ code
char *pBuf =new char [1024w

获取次数:5
Recv耗时:5289ms
当我把缓存大小修改为1024时,返回的结果为:
获取次数:29
Recv耗时:5382ms
耗时差不多,我不知道为什么,接受几次的数据却耗了这么多时间,却高手给下解答,如果是阻塞的问题,麻烦给一个解决办法
nRet=recv(hSocket, pBuf,1024*1024*100, 0);
我用大缓存去一次接收却接受数据不完全,有点奇怪……

[解决办法]

recv()数据也是要等对方主机发送了数据,经过一个网络传输时延,到达本地底层缓冲,再复制给应用缓冲才返回的。并且,当你调用recv()时,对方是否已经,正在,过一会才发送数据?

TCP是个有应答机制的协议,对方主机第一次发送完成后,还需要应答才发送后续数据。

应用层的缓冲大小和在内核中的,socket的接收缓冲区大小不是一回事。
[解决办法]
可以在之前加上超时:
FD_ZERO(&ReadSet);
FD_SET(socketSW,&ReadSet);
TimeOut.tv_sec = 2;
TimeOut.tv_usec = 0;
result = select(0, &ReadSet, NULL,NULL, &TimeOut);
if(result > 0) {
nread = recvfrom(socketSW, Rbuf, ACK_SIZE, 0, (struct sockaddr*)&sourceaddr,(socklen_t*)&length);
}
并且你用的是TCP,而TCP是基于流式的,而基于流式的话数据消息就没有消息保护边界,也就是说只要有缓冲区有数据就会读取,所以大的缓冲区一次读的多,次数少,而小的缓冲区一次读的少,读的次数多,但是两个的总时间是差不多的

nRet=recv(hSocket, pBuf,1024*1024*100, 0);
我用大缓存去一次接收却接受数据不完全,有点奇怪……
你这个方法是可能不对的,因为PC的缓冲区大小是要靠setsocket这个函数设置的,如果他默认的是8k,而你接受的时候写了9k,很肯定就不对了,你一定要通过getsocket读出自己缓冲区的大小,再通过setsocket设置缓冲区的大小


[解决办法]
非阻塞的话,收不到数据通常是因为数据还没有到达..
[解决办法]
探讨

他就不能提前判断数据是否完全达到吗,当数据完全达到之后再来处理

[解决办法]
可以增大缓存。但有时候recv一部分数据达到也是返回的,所以还要循环多次读取的。
[解决办法]
while多次读取,或者是用select函数

热点排行