用Socket的recv来接一个http包,若包头中没有content-length,怎么判断http包已收完?

stoat 2008-09-11 06:25:56
用Socket的recv来接一个http包,若包头中没有content-length,怎么判断http包已收完?
...全文
432 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jourbin 的回复:]
个人觉得有3种情况
1,有content-length
解决办法: 根据长度读取就行了

2,transfer-encoding:chunked
解决办法: 根据chunk编码实现协议栈

3,以上2项都没有,但是有connection:close
解决办法: 根据recv返回0(服务器已经断开连接)
[/Quote]
这里提到的3是一种异常,任何时候都需要处理.

其实第三种是找不到相关表示长度或者编码域的,默认以换行符结束的情况.
http-header\r\n\r\n
something\r\n
xsc2001 2008-09-11
  • 打赏
  • 举报
回复
这个就是判断socket接收的字节大小(nRecvSize)

int nReceSize = recv(m_s, buffer, nMaxLength, 0);
while(1)
{
if(nReceSize <= 0 || nReceSize == WSAECONNRESET)
break;
nReceSize = recv(sck, buffer, nMaxLength, 0);
}

以上代码是在三种情况下结束接收数据,一是服务器端Socket关闭,另一个是Socket出错,再一个就是Socket超时。
jourbin 2008-09-11
  • 打赏
  • 举报
回复
个人觉得有3种情况
1,有content-length
解决办法: 根据长度读取就行了

2,transfer-encoding:chunked
解决办法: 根据chunk编码实现协议栈

3,以上2项都没有,但是有connection:close
解决办法: 根据recv返回0(服务器已经断开连接)
僵哥 2008-09-11
  • 打赏
  • 举报
回复
那检查
Transfer-Encoding: chunked

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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