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