我用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)谢谢了

解决方案 »

  1.   

    你的buf也太小了吧.建议改为512或更大.if(num==25)
    {
    flag=0;
    str=str+byte;
    }
    并且不一定当接收的数据长度等25就一定还有数据没收完.
      

  2.   

    to 一楼我知道.还有就是正好收完.我已经计算在里面了.
    但是我想知道在byte没放满的情况下,如何知道后面还有数据.
      

  3.   

    to2楼是可以循环接收.但是在什么情况下判断已经全部收完,然后退出呢?我身边的书都是通过byte没防满来判断是否已经接收完的.但是这个方法对数据量的情况不适用啊!还有我上面的假设不知道对不对(就是可数据包有关)
      

  4.   

    解析到可以.因为网页都是一些元素标签.只要看看数据最后几位有没有特殊标签就可以了.但是如果是下载一些文件的话,又应该怎么办呢.还有有没有人能回答我出现byte没放满,后面还有数据.到底是不是和数据包有关系.
      

  5.   

    我觉得使用解析比较好,毕竟对于网页不像简单的文件传输,可以用文件结束标志来判别~~
    可以根据网页的特殊的Tag来判断~~
    对于文件的话,看能不能通过首先获取下载的文件大小来作为判别的依据~~~