zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    JSP
    结束程序-wpscloudsvr 程序没有响应,要返回Windows并检查程序状态,请单击“取消”,如果选择立即结束程序,你会失去
    解决Serlet API没导进导致的错误
    JDBC工具类
    数据库小项目
    数据库外键主键
    Mysql操作表时报错Table doesn't exist解决办法
    这大概是最细的YOLOX中的Mosaic And Mixup 实现源码分析了吧
    Sigcomm20 Hoyan 阅读笔记
    定时获取最新ssr服务器的方法
  • 原文地址:https://www.cnblogs.com/chuncn/p/2417889.html
Copyright © 2011-2022 走看看