• 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;
    }
    

      

  • 相关阅读:
    Spring Cloud Eureka(七):DiscoveryClient 源码分析
    Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server
    Centos 查看CPU个数、核心数等信息
    Spring Cloud Eureka(五):Eureka Server 启动流程分析
    GlusterFS常用命令
    修改内核参数ip_local_reserved_ports避免tomcat端口占用
    TTM模块安装
    查看磁盘raid信息
    Kubernetes中的PodIP、ClusterIP和外部IP
    ubuntu 14.04.5 kern numa bug
  • 原文地址:https://www.cnblogs.com/chuncn/p/2417889.html
Copyright © 2020-2023  润新知