签到

05月06日
尚未签到

共有回帖数 0

    做月子

    等级:
    #includestdio.h
    #includeWindows.h
    #includememory.h
    struct cfgmain
    {
        long size;
        long Received;
        char website[1000];
    }
    int LoadWSA()
    {
        WSADATA wd;
        if(WSAStartup(0x0101,&wd))
        {
            return -1;
        }
        return 0;
    }
    void downThread(char *url,int threadID,int rangeFrom,int rangeUntil,FILE *cfg,FILE *fp)
    {
        char *oriURL=url;
        char *ReadWriteBuf=(char*)malloc(20000);
        cfgmain cfgfile;
        char bufferSend[65535];
        char *bufferRecv=(char*)malloc(65535);
        if(strstr(url,"http://"))
        {
            url=url+sizeof("http://");
        }
        int lengthOfWeb;
        for(lengthOfWeb==0;lengthOfWeb=sizeof(url);lengthOfWeb++)
        {
            if(url[lengthOfWeb]=='/')
            {
                break;
            }
        }
        char name[255];
        memcpy(name,url,lengthOfWeb);
        SOCKET sock=::socket(2,SOCK_STREAM,0);
        struct hostent *h;
        h=gethostbyname(name);
        if(h==0)
        {
            printf("ThreadID :#%d     ERROR:%d     The thread will exit!n",threadID,WSAGetLastError());
            return;
        }
        struct sockaddr_in saddr;
        memcpy(&saddr.sin_addr,h-h_addr_list,h-h_length);
        saddr.sin_port=htons(80);
        saddr.sin_family=AF_INET;
        if(connect(sock,(sockaddr*)&saddr,sizeof(sockaddr)))
        {
            printf("ThreadID :#%d     ERROR:%d     The thread will exit!n",threadID,WSAGetLastError());
            return;
        }
        url=url+sizeof(h-h_length)+1;
        unsigned int temp;
        if(cfg==0)
        {
            sprintf(bufferSend,"GET /%s HTTP/1.1rnHost: %srnConnection: closernrn",url,h-h_name);
     }
       
        else
        {
            fread(&cfgfile,1,sizeof(cfgmain),cfg);
            rewind(cfg);
            sprintf(bufferSend,"GET /%s HTTP/1.1rnHost: %srnConnection: closernAccept-Range: %d-rnrn",url,h-h_name,cfgfile.Received);
            send(sock,bufferSend,strlen(bufferSend),0);
            temp=recv(sock,bufferRecv,65535,0);

        }
        lengthOfWeb=0;
        for(lengthOfWeb==0;lengthOfWeb=sizeof(bufferRecv);lengthOfWeb++)
        {
            if(url[lengthOfWeb]=='r'&&url[lengthOfWeb+1]=='n'&&url[lengthOfWeb+2]=='r'&&url[lengthOfWeb+3]=='n')
            {
                break;
            }
        }
        url=url+3;
        char *oribufRecv=bufferRecv;
        bufferRecv=bufferRecv+lengthOfWeb;
        fwrite(bufferRecv,1,temp-lengthOfWeb,fp);
        for(;;)
        {
            temp=recv(sock,oribufRecv,65535,0);
            if(temp=1)
            {
                fwrite(oribufRecv,1,temp,fp);
            }
            else
            {
                printf("Finish Downloading!n");
                fclose(fp);
            }
        }
    }


    原理是透过http进行传输,至于监测http回应的数据的开始位置,我们用循环检测,一旦检测到两个连续的0x0D 0x0A,我们就知道数据重这里开始。然后进入循环不断接受,一旦受到的数据包大小为0,证明服务器已经断开连接,也就是下载完毕

    楼主 2015-11-26 13:47 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知