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("\nserverName = %s; sourcePath = %s; fileName = %s\n",serverName.c_str(),sourcePath.c_str(),fileName.c_str());
 
    WSADATA wsaData;
    int nRet;
 
    //
    // Initialize WinSock.dll
    //
    nRet = WSAStartup(0x101, &wsaData);
    if (nRet)
    {
        //log.debug("\nWinSock.dll initialize failed. WSAStartup(): %d\n", nRet);
        WSACleanup();
        return false;
    }
    else       
    {
        //log.debug("\nWSAStartup success!\n");
    }
 
    //
    // Check WinSock version
    //
    if (wsaData.wVersion != 0x101)
    {
        //log.debug("\nWinSock version not supported\n");
        WSACleanup();
        return false;
    }
    else
        {
            //log.debug("\nwsaData.wVersion ==0x101\n");
        }
 
    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\n", 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("\nrecv() 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值