• Win32 HTTP Download


    头文件HTTPClient.h:

    #pragma once
    #ifndef HTTPClient_H_
    #define HTTPClient_H_
     
    #include <string>
    using namespace std;
     
    class HTTPClient
    {
    public:
        HTTPClient(void);
        ~HTTPClient(void);
     
        bool DownloadFile(string serverName,int port,string sourcePath, string fileName, string localDirectory);
    };
    #endif

    源文件HTTPClient.cpp:

    #include "StdAfx.h"
    #include "HTTPClient.h"
    #include <winsock.h>
    #include <fstream>
    //#include "Log.h"
    #pragma comment(lib,"ws2_32.lib")
     
    HTTPClient::HTTPClient(void)
    {
    }
     
    HTTPClient::~HTTPClient(void)
    {
    }
     
    bool HTTPClient::DownloadFile(string serverName,int port, string sourcePath, string fileName, string localDirectory)
    {
        //Log &log = Log::getLog("HTTPClient","DownloadFile");
        //log.debug("
    serverName = %s; sourcePath = %s; fileName = %s
    ",serverName.c_str(),sourcePath.c_str(),fileName.c_str());
     
        WSADATA wsaData;
        int nRet;
     
        //
        // Initialize WinSock.dll
        //
        nRet = WSAStartup(0x101, &wsaData);
        if (nRet)
        {
            //log.debug("
    WinSock.dll initialize failed. WSAStartup(): %d
    ", nRet);
            WSACleanup();
            return false;
        }
        else       
        {
            //log.debug("
    WSAStartup success!
    ");
        }
     
        //
        // Check WinSock version
        //
        if (wsaData.wVersion != 0x101)
        {
            //log.debug("
    WinSock version not supported
    ");
            WSACleanup();
            return false;
        }
        else
            {
                //log.debug("
    wsaData.wVersion ==0x101
    ");
            }
     
        ofstream fout;
        string newfile = localDirectory + fileName;
        fout.open(newfile.c_str(),ios_base::binary);
        if(!fout.is_open())
        {
            //log.debug("open newfile error!");
        }
        else
            {
                //log.debug("open local newfile success!");
            }
     
        IN_ADDR        iaHost;
        LPHOSTENT    lpHostEntry;
     
        iaHost.s_addr = inet_addr(serverName.c_str());
        if (iaHost.s_addr == INADDR_NONE)
        {
            // Wasn't an IP address string, assume it is a name
            lpHostEntry = gethostbyname(serverName.c_str());
        }
        else
        {
            // It was a valid IP address string
            lpHostEntry = gethostbyaddr((const char *)&iaHost, 
                sizeof(struct in_addr), AF_INET);
        }
        if (lpHostEntry == NULL)
        {
            //log.debug("gethostbyname() error");
            return false;
        }
        else
            {
                //log.debug("gethostbyname() success!");
            }
     
        //    
        // Create a TCP/IP stream socket
        //
        SOCKET    Socket;    
     
        Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (Socket == INVALID_SOCKET)
        {
            //log.debug("socket() error"); 
            return false;
        }
        else
            {
                //log.debug("socket() success!");
            }
     
        //
        // Find the port number for the HTTP service on TCP
        //
        SOCKADDR_IN saServer;
        //LPSERVENT lpServEnt;
     
        //lpServEnt = getservbyname("http", "tcp");
        //if (lpServEnt == NULL)
        //  saServer.sin_port = htons(80);
        //else
        //  saServer.sin_port = lpServEnt->s_port;
     
        saServer.sin_port = htons(port);
     
        //
        // Fill in the rest of the server address structure
        //
        saServer.sin_family = AF_INET;
        saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
     
        //
        // Connect the socket
        //
        nRet = connect(Socket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
        if (nRet == SOCKET_ERROR)
        {
            //log.debug("connect() error");
            closesocket(Socket);
            return false;
        }
        else
            {
                //log.debug("connect() success!");
            }
         
        //
        // Format the HTTP request
        //
        char szBuffer[1024];
     
        string requestFile = sourcePath + fileName;
     
        sprintf(szBuffer, "GET %s
    ", requestFile.c_str());
        //log.debug("sended GET %s Request",requestFile.c_str());
        nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
        if (nRet == SOCKET_ERROR)
        {
            //log.debug("send() error");
            closesocket(Socket);    
            return false;
        }
     
        //
        // Receive the file contents and print to stdout
        //
        while(1)
        {
            // Wait to receive, nRet = NumberOfBytesReceived
            nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
            if (nRet == SOCKET_ERROR)
            {
                //log.debug("recv() error");
                break;
            }
     
            //log.debug("
    recv() returned %d bytes", nRet);
            // Did the server close the connection?
            if (nRet == 0)
                break;
            // Write to stdout
            //        fwrite(szBuffer, nRet, 1, stdout);
            fout.write(szBuffer,nRet);
        }
        closesocket(Socket);    
        fout.close();
     
        WSACleanup();
        return true;
    }

    调用示例:

    #include "stdafx.h"
    #include "HTTPClient.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
        HTTPClient* client;
        client=new HTTPClient();
        bool a = client->DownloadFile("127.0.0.1",80,"/","KeyBoardSelectionComboBox.zip","c:\");
        bool b = client->DownloadFile("www.zt.cn",88,"/ClientBin/","Main.xap","c:\");
         
        return 0;
    }
  • 相关阅读:
    api服务器思路
    利用express写api接口
    sql基础语句
    安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)
    JavaScript垃圾回收机制和闭包
    用git clone 远程的所有分支
    面试题重点
    Linux 常用命令
    防抖函数和节流函数
    GIT PUSH 出现EVERYTHING UP-TO-DATE 解决方法
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/8647854.html
Copyright © 2020-2023  润新知