socket 接收压缩的数据时,总是接受不全

zhufengyiran 2015-06-26 09:58:05
socket接受对方的数据但是连上报文头,接受到的数据如下:

HTTP/1.1 200 OK^M
108 Server: nginx/1.8.0^M
109 Date: Thu, 25 Jun 2015 17:22:22 GMT^M
110 Content-Type: application/json;charset=UTF-8^M
111 Content-Length: 2457^M
112 Connection: close^M
113 Content-Encoding: gzip^M
114 ^M
115 ^_XX

代码应该没有问题:如下:
//声明并设置信号量
struct sigaction alrmact;
memset(&alrmact,0,sizeof(alrmact));
alrmact.sa_handler = dealSigAlarm;
alrmact.sa_flags = SA_NODEFER;//使用SA_RESTART将会阻塞在recv函数,与直接使用signal效果相同
sigaction(SIGALRM, &alrmact, NULL);

alarm(EngineParameter::HTTP_RECIEVE_TIMEOUT / 1000);//设置警报时间,HTTP_RECIEVE_TIMEOUT单位为毫秒

while(1)
{
recvResult = recv(_sockfd, (void*)buf, bufferSize -1, MSG_WAITALL);

if (recvResult < 0)
{
if(errno == EINTR)
{
//socket recv超时
throw CMDError("Socket接收数据超时,错误号:" + FreeFun::toString(errno), "Socket recieve timeout, error no:" + FreeFun::toString(errno));
break;
}
else
{
//socket recv错误
throw CMDError("Socket接收数据错误,错误号:" + FreeFun::toString(errno), "Socket recieve error, error no:" + FreeFun::toString(errno));
break;
}
}
else if(recvResult == 0)
{
//这里表示对端的socket已正常关闭
break;
}
resultStream<<buf;
memset(buf, 0, bufferSize);
}
想请各位大神帮忙看一下。。。
感觉是我们这边还没接受完,对端已经关闭了,所以接受到的不完全,是不是可以这样理解,但是对方传来的数据长度并不大,且我设置的缓冲区的长度是8192,远大于他们的长度,应该一次发送完毕啊,为什么接受不全呢?
...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ngo tong 2015-06-29
  • 打赏
  • 举报
回复
@zhufengyiran 客户端也是Linux??sudo组用户可以执行tcpdump,可以试下本用户是否是sudo组的,密码是本帐户的登录密码 [XXXX]$sudo tcpdump
赵4老师 2015-06-29
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
zhufengyiran 2015-06-28
  • 打赏
  • 举报
回复
引用 5 楼 dooX8086 的回复:
[quote=引用 4 楼 dooX8086 的回复:] 非阻塞 socket if ( errno == EINTR ) 应该作 continue; 处理.
哦~~看错了。。看成 eagain 了 - -!!![/quote] 嗯,这边应该是对方socket的链接断开了,但是为什么一次可以接受的东西,只有3个字节,这个socket的内容并不长,一次发送就可以接受的,实体内容只有2457,加上http报文头,也就有2500,不知道为什么总是接收不到,真是看不出来啊!
zhufengyiran 2015-06-28
  • 打赏
  • 举报
回复
引用 2 楼 love1937 的回复:
用抓包软件wireshark (Windows)或 tcpdump(Linux)看看数据真到了没
你好这个机器是在服务器上的,但是我们这边没人知道这台服务器的root用户的权限,试过tcpdump的
zhufengyiran 2015-06-28
  • 打赏
  • 举报
回复
引用 1 楼 love1937 的回复:
resultStream<<buf; //也许已经完全接收到了,只是该行调用舍弃了,缓冲满了?? 试试printf("%s\n", buf);
你好,我看了一下,似乎内容就是只有下面的这些 HTTP/1.1 200 OK^M Server: nginx/1.8.0^M Date: Thu, 25 Jun 2015 17:22:22 GMT^M Content-Type: application/json;charset=UTF-8^M Content-Length: 2457^M Connection: close^M Content-Encoding: gzip^M ^M ^_XX
dooX8086 2015-06-26
  • 打赏
  • 举报
回复
引用 4 楼 dooX8086 的回复:
非阻塞 socket if ( errno == EINTR ) 应该作 continue; 处理.
哦~~看错了。。看成 eagain 了 - -!!!
dooX8086 2015-06-26
  • 打赏
  • 举报
回复
非阻塞 socket if ( errno == EINTR ) 应该作 continue; 处理. 设置的缓冲区 是指 buf ? 还是 socket 缓冲区?但不管是指那个都没有影响 还有 tcp 收发多少次跟 缓冲区 不是线性关系 记得取消 alarm 把收到的数据都printf出来看看
FightForProgrammer 2015-06-26
  • 打赏
  • 举报
回复
抓包看看吧。
ngo tong 2015-06-26
  • 打赏
  • 举报
回复
用抓包软件wireshark (Windows)或 tcpdump(Linux)看看数据真到了没
ngo tong 2015-06-26
  • 打赏
  • 举报
回复
resultStream<<buf; //也许已经完全接收到了,只是该行调用舍弃了,缓冲满了?? 试试printf("%s\n", buf);

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧