Http协议的发送和接收怎样循环?

zyq_123 2012-03-23 01:54:52
就是说,整个数据长度超出缓存长度,那怎样循环接收/发送?怎样取得消息报头?
...全文
167 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmz5858 2012-03-24
  • 打赏
  • 举报
回复
给你一小段代码吧,你在一个循环里面recv,然后调用就好了,然后它会自动给你分发的。
class HttpMsgDispatch
{
protected:
char m_bStop;
char m_bIsBody;
std::string m_strHeaderCache;
HttpMsgDispatch(HttpMsgDispatch const& rhs);//不可copy
HttpMsgDispatch& operator = (HttpMsgDispatch const& rhs);
public:
HttpMsgDispatch():m_bStop(0), m_bIsBody(0){}
void Cancel()
{
m_bStop=1;
}

void Clear()
{
m_bStop=0;
m_bIsBody=0;
m_strHeaderCache.clear();
}

int operator () (char* buffer, int length)
{
std::string::size_type nPos=std::string::npos;
int handleResult=0;
if(m_bStop)
return -1;
if(m_bIsBody)
{
//return m_owner.handleHttpBody(buffer, length);
}
m_strHeaderCache.append(buffer, length);
nPos = m_strHeaderCache.find("\r\n\r\n");
if(nPos!=std::string::npos)//找到http头部!
{
m_bIsBody=1;
//handleResult=m_owner.handleHttpHeader(m_strHeaderCache, nPos);

if(handleResult)//错了留下
return handleResult;
nPos+=sizeof("\r\n\r\n")-1;
if(nPos < m_strHeaderCache.length())
{
//handleResult = m_owner.handleHttpBody(m_strHeaderCache.c_str()+nPos, m_strHeaderCache.length()-nPos);
}
m_strHeaderCache.clear();//清空缓存
return handleResult;
}
return 0;
}
};
bluewanderer 2012-03-23
  • 打赏
  • 举报
回复
比如Apache默认一行最长是8192,IIS默认是16384

如果不知道的话也变长吧
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bluewanderer 的回复:]
1. recv大于约定一行最大长度的数据;
2. 找到当前第一行的结束;
3. 如果数据读完了,到1循环;
4. 如果当前行是空行,说明头结束了;
5. 否则处理,丢弃当前行,到2循环;
[/Quote]

很好,表示感谢。约定一行最大长度是多少?
bluewanderer 2012-03-23
  • 打赏
  • 举报
回复
1. recv大于约定一行最大长度的数据;
2. 找到当前第一行的结束;
3. 如果数据读完了,到1循环;
4. 如果当前行是空行,说明头结束了;
5. 否则处理,丢弃当前行,到2循环;
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bluewanderer 的回复:]
如果你只需要头里的特定信息大可按事件逻辑处理,如果你希望写一个通用HTTP工具,最省事的办法是拿一个变长容器不管头多大都一次装进去。\r\n\r\n我认为自己用if判断就足够了...
[/Quote]

另外,我要将消息报头域的值存入变量,你认为使用什么方法比较合适。
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bluewanderer 的回复:]
如果你只需要头里的特定信息大可按事件逻辑处理,如果你希望写一个通用HTTP工具,最省事的办法是拿一个变长容器不管头多大都一次装进去。\r\n\r\n我认为自己用if判断就足够了...
[/Quote]

我要取得消息报头,然后知道实体数据长度,再循环接收。
bluewanderer 2012-03-23
  • 打赏
  • 举报
回复
如果你只需要头里的特定信息大可按事件逻辑处理,如果你希望写一个通用HTTP工具,最省事的办法是拿一个变长容器不管头多大都一次装进去。\r\n\r\n我认为自己用if判断就足够了...
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wmz5858 的回复:]
收到数据就存到内存中,直到收到\r\n\r\n为止,头又不会很长。之后你该怎么处理就怎么处理。
[/Quote]

怎样解析消息头?用字符串处理函数,还是用正则表达式?
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluewanderer 的回复:]
Http数据是不依赖底层协议的,Http流只要不打乱顺序可以被任意拆分,一个字节一个字节发送也是没问题的。
[/Quote]

我的问题是确定不是消息头的长度,怕一次接收不完或有多。
zyq_123 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wmz5858 的回复:]
收到数据就存到内存中,直到收到\r\n\r\n为止,头又不会很长。之后你该怎么处理就怎么处理。
[/Quote]

那不就是要一个一个字节的收?
wmz5858 2012-03-23
  • 打赏
  • 举报
回复
收到数据就存到内存中,直到收到\r\n\r\n为止,头又不会很长。之后你该怎么处理就怎么处理。
bluewanderer 2012-03-23
  • 打赏
  • 举报
回复
Http数据是不依赖底层协议的,Http流只要不打乱顺序可以被任意拆分,一个字节一个字节发送也是没问题的。

64,649

社区成员

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

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