社区
C++ 语言
帖子详情
Http协议的发送和接收怎样循环?
zyq_123
2012-03-23 01:54:52
就是说,整个数据长度超出缓存长度,那怎样循环接收/发送?怎样取得消息报头?
...全文
167
12
打赏
收藏
Http协议的发送和接收怎样循环?
就是说,整个数据长度超出缓存长度,那怎样循环接收/发送?怎样取得消息报头?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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流只要不打乱顺序可以被任意拆分,一个字节一个字节发送也是没问题的。
C#串口调试工具源码
4、字符和十六进制数据可以定时
循环
发送
。 5、支持自定义帧格式,自动加入校验。可选和校验和异或校验。 6、有十进制十六进制互转功能,方便参数计算。 7、
接收
分别以字符和十六进制显示,完美支持中文显示和回车...
26 API-网络编程(网络概述,Socket通信机制,UDP协议
发送
和
接收
数据,TCP协议
发送
和
接收
数据)
API-网络编程(网络概述,Socket通信机制,UDP协议
发送
和
接收
数据,TCP协议
发送
和
接收
数据)
计算机网络 应用层 诸多协议 实验环境搭建
# http 协议、版本和网页 创建网页(准备创建网站、需要设计网页和安装Web服务器) 统一资源定位符URL 绝对路径和相对路径 创建Web站点
HTTP协议
版本 HTTP请求报文和响应报文 HTTP响应报文: Cookie 通过代理服务器...
Java使用UDP协议
发送
和
接收
数据
Java使用UDP协议
发送
和
接收
数据
基于UDP协议的
接收
和
发送
主机C向主机S
发送
数据包0、数据包1、数据包2、数据包3, 各个数据包途中经过路由器A、路由器B、路由器C, 先后到达主机S, 在主机S端的循序仍然为数据包0、数据包1、数据包2、数据包3, 即
发送
数据时的顺序和
接收
数据时...
C++ 语言
64,649
社区成员
250,477
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章