Socket中Recv耗时很长,阻塞C/C++ codechar *pBuf new char [1024w获取次数:5Recv耗时:5289ms当我把缓存大
Socket中Recv耗时很长,阻塞
C/C++ codechar *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函数