CSocket 问题

fanqing 2006-09-16 01:22:03
我用CSocket 编程下载某网页.
接收数据函数如下
CString MyReceive(CSocket *sock)
{
CString str="";
int flag=0;
int num;
BYTE byte[26];
byte[25]='\0';

while(flag==0)
{
num=sock->Receive(byte,25);
if(num==SOCKET_ERROR)
{
MessageBox(NULL,"MyReceive error",NULL,MB_OK);
flag=1;
}
else
if(num>=0&&num<25)
{
flag=1;
byte[num]='\0';
str=str+byte;
}
else
if(num==25)
{
flag=0;
str=str+byte;
}

}
return str;
}
意思是如果byte没有放满说明接收数据结束了.

发现如果网页代码比较简单时,可以正常接收.如果网页比较复杂的时候只能接收到前面一部分.
会不会是因为数据包的问题,因为网页比较复杂,所以要分几个包包发送,而我的接收在byte没有放满的时候就结束了,其实这只是第一包.所以后续的没收到.我试着又调用一次这个函数,确实收到了后面的.但是如果有n个包.我又不可能调用n次函数.
有什么办法可以解决吗?(不使用异步,就使用csocket)

谢谢了
...全文
220 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowbirdfly 2006-09-17
  • 打赏
  • 举报
回复
我觉得使用解析比较好,毕竟对于网页不像简单的文件传输,可以用文件结束标志来判别~~
可以根据网页的特殊的Tag来判断~~
对于文件的话,看能不能通过首先获取下载的文件大小来作为判别的依据~~~
fanqing 2006-09-17
  • 打赏
  • 举报
回复
to楼上那么有什么办法知道还有余下数据呢?
DentistryDoctor 2006-09-17
  • 打赏
  • 举报
回复
它并不一定是你请求多少字节就返回多少字节的。

fanqing 2006-09-17
  • 打赏
  • 举报
回复
up
fanqing 2006-09-16
  • 打赏
  • 举报
回复
解析到可以.因为网页都是一些元素标签.只要看看数据最后几位有没有特殊标签就可以了.但是如果是下载一些文件的话,又应该怎么办呢.

还有有没有人能回答我出现byte没放满,后面还有数据.到底是不是和数据包有关系.
fanqing 2006-09-16
  • 打赏
  • 举报
回复
to2楼是可以循环接收.但是在什么情况下判断已经全部收完,然后退出呢?我身边的书都是通过byte没防满来判断是否已经接收完的.但是这个方法对数据量的情况不适用啊!还有我上面的假设不知道对不对(就是可数据包有关)
jixingzhong 2006-09-16
  • 打赏
  • 举报
回复
根据包的内容解析是否还有后续数据。
否则总有局限的
fanqing 2006-09-16
  • 打赏
  • 举报
回复
to 一楼我知道.还有就是正好收完.我已经计算在里面了.
但是我想知道在byte没放满的情况下,如何知道后面还有数据.
cloudgamer 2006-09-16
  • 打赏
  • 举报
回复
不能循环接收?
mynamelj 2006-09-16
  • 打赏
  • 举报
回复
你的buf也太小了吧.建议改为512或更大.

if(num==25)
{
flag=0;
str=str+byte;
}
并且不一定当接收的数据长度等25就一定还有数据没收完.

18,356

社区成员

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

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