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