求教关于CAsyncSocket::OnReceive()的问题

xmanner 2009-09-02 04:47:44
最近在做一个任务..
就是写一个MFC程序作为IE与远程网站之间的中介~
也就是IE访问我的程序..我的程序将IE发来的包转发至别的网站(如www.163.com)..再将从www.163.com返回的包回馈给IE..以实现IE浏览网站的目的~
我使用MFC里的CAsyncSocket类~
创建了三个套接字..一个用于监听..一个用于与本地IE的连接..一个用于与外部网站的连接~
已经实现的功能有:
建立监听..接受IE访问的请求~
获取由IE发来的HTTP包..
建立远程连接..连接到外部网站..
将IE发来的HTTP包转发至外部网站~
但是遇到这样一个问题:
重载OnReceive函数用于接收外部网站过来的数据包~我用了一个固定长度的缓冲区去接收(m_szRecvBuf[2048];)
但是我观察了一下数据包过来的时候不是一次性接受完的~分大概两三次..而且也没办法预知它的长度~
我这样写
m_length = Receive(m_szRecvBuf, sizeof(m_szRecvBuf));
TRACE(m_szRecvBuf);
会直接弹框报错..挂程序~
请问有什么办法判断已经接收完本次数据包,进而可以将本次数据包转发给IE呢?
...全文
240 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bragi523 2009-09-11
  • 打赏
  • 举报
回复
只能抓包看看
有没有长度或结束符可以用
要不然很难实现
sun007700 2009-09-10
  • 打赏
  • 举报
回复
"m_length = Receive(m_szRecvBuf, sizeof(m_szRecvBuf));
TRACE(m_szRecvBuf);
会直接弹框报错..挂程序~
请问有什么办法判断已经接收完本次数据包,进而可以将本次数据包转发给IE呢?
"
报错,是TRACE的问题,而不是Receive的问题。
判断包是否接收完,IE发过来的包应该也是有结束符标志的吧,当一个完整的包接收完了就可以转发了。
月竹影 2009-09-04
  • 打赏
  • 举报
回复
你调用一次Receive()后,继续再调用多次Receive,直到返回的值小于0,表示接收出错或者是已经没有数据了,这个时候你再处理返回码,
注意:CAsyncSocket 的Receive的返回值小于0并不表示就是连接断了或者出错了,你要分析返回码是多少,然后根据返回码来处理,比如返回码为WSAEWOULDBLOCK 这个应该表示当前没有数据,WSAEMSGSIZE 表示到来的数据长度大于给出的BUFFER长度,这些,你要看着MSDN来分析
fangle6688 2009-09-03
  • 打赏
  • 举报
回复
如果你仅仅支持用户访问固定的某个网站,你可以使用CAsyncSocket
使用一个CAsyncSocket将并发的用户请求与网站进行异步交换

如果你需要支持用户访问不同的网站,你应该放弃CAsyncSocket
因为你必须频繁地close、create、connect,你根本无法体现异步通信的优势

你的应该考虑多线程同步:

1、每个用户分配一个子线程
2、子线程中同步完成以下步骤:接收用户请求、转发到目标网站、接收网站回复、转发给用户

这样的系统结构清晰,性能稳定,唯一的不足是并发用户数大于100后会变得很慢
如果你要支持大并发用户量,IOCP是你唯一选择,CAsyncSocket更加要放弃

至于HTTP包的接收问题,解决思路有几种:

1、包头判别法,每个HTTP包都有HEAD,其中有LENGTH域,可以获取包长度
不过LENGTH域不包括HEAD本身的长度,判别起来比较麻烦

2、包尾判别法,HTTP协议包,若不含<HTML>,则以“\r\n\r\n”结尾,否则以</HTML>结尾

feiyangdn 2009-09-03
  • 打赏
  • 举报
回复
带外数据丢失, 建议开辟更多的缓冲区用来存储数据
xmanner 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dirdirdir3 的回复:]
是做proxyserver?
[/Quote]
是的~以前没用过CAsyncSocket
觉得不太理解啊= =
有什么好的建议么?~
yanchong 2009-09-02
  • 打赏
  • 举报
回复
路过
dirdirdir3 2009-09-02
  • 打赏
  • 举报
回复
是做proxyserver?
zyq5945 2009-09-02
  • 打赏
  • 举报
回复
用CString试试,不行你就在构造函数new分配个大点的空间,析构函数释放掉。

18,356

社区成员

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

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