STLVisual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
使用 WININET 的 WWW (HTTP/HTTPS/FTP) 客户端






4.04/5 (26投票s)
同步/异步 WWW 客户端:支持 HTTP/HTTPS GET、POST、POST multipart/form-data。也支持 FTP GET 文件、PUT 文件。
引言
这个类用于 HTTP/HTTPS 请求和 FTP 请求。
支持的方法有:
- HTTP/HTTPS
- GET
- POST
- POST multipart/form-data
- FTP
- GET 文件
- PUT 文件
类概述
// synchronized www client class W3Client { public: enum w3t { w3ftp, w3http, w3https }; enum w3m { reqGet, reqPost, reqPostMultipartsFormdata }; public: W3Client(){ _hOpen=NULL; _hConnection=NULL, _hRequest=NULL; } virtual ~W3Client(){ InitializePostArguments(); InitializeCookies();} public: // connection handling bool Connect(const char *szaddress, const char *szuser=NULL, const char *szpassword=NULL, const char *szagent=__W3_DEFAULT_AGENT); virtual bool Connect(const char *szaddress, long nport, const char *szuser=NULL, const char *szpassword=NULL, w3t t=w3http, const char *szagent=__W3_DEFAULT_AGENT); const char *GetURI(){ return _szuri.c_str(); } void Close(); // post argument handling void InitializePostArguments(); void AddPostArgument(const char *szname, const int nvalue); void AddPostArgument(const char *szname, const long nvalue); void AddPostArgument(const char *szname, const float nvalue); void AddPostArgument(const char *szname, const double nvalue); void AddPostArgument(const char *szname, const char *szvalue, bool bfile=false); // cookie handling void InitializeCookies(); void AddCookie(const char *szname, const double value); void AddCookie(const char *szname, const float value); void AddCookie(const char *szname, const long value); void AddCookie(const char *szname, const int value); void AddCookie(const char *szname, const char *szvalue); // http/https request handling bool Request(const char *szuri, w3m m=reqGet, const char *szref=NULL); unsigned long Response(unsigned char *buf, unsigned long len); unsigned int QueryResult(); const char * QueryContentType(); unsigned long QueryContentLength(); unsigned long QueryCookie(unsigned char *buf, unsigned long len, unsigned long idx=0); unsigned long QueryRawHeader(unsigned char *buf, unsigned long len); // ftp handling bool PutFile(const char *szuri, const char *szfile, bool ascii=false); bool GetFile(const char *szuri, const char *szfile, bool ascii=false); unsigned long PutFile(const char *szuri, unsigned char *buf, unsigned long len, bool ascii=false); unsigned long GetFile(const char *szuri, unsigned char *buf, unsigned long len, bool ascii=false); ... }; // Asynchronized www client class AsyncW3Client : public W3Client { ... public: bool Connect(const char *szaddress, INTERNET_STATUS_CALLBACK lpfn, const char *szuser=NULL, const char *szpassword=NULL, const char *szagent=__W3_DEFAULT_AGENT); bool Connect(const char *szaddress, long nport, INTERNET_STATUS_CALLBACK lpfn, const char *szuser=NULL, const char *szpassword=NULL, w3t t=w3http, const char *szagent=__W3_DEFAULT_AGENT); bool Request(const char *szuri, w3m m=reqGet, const char *szref=NULL){ _hCompleteRequestEvent=::CreateEvent(NULL, FALSE, FALSE, NULL); return W3Client::Request(szuri, m, szref); } unsigned long Response(unsigned char *buf, unsigned long len){ ::CloseHandle(_hCompleteRequestEvent); _hCompleteRequestEvent=NULL; return W3Client::Response(buf, len); } public: void SetCompleteRequest(); bool WaitCompleteRequest(unsigned long ntime=INFINITE); ... };
同步 W3Client
Connect(...)
方法连接到 HTTP 服务器。Close()
方法关闭连接。这些方法与RequestOfURI(...)
一起使用。InitializePostArguments()
方法初始化 POST 参数。AddPostArgument(...)
方法支持添加以下类型的新的 POST 参数:string
、int
、long
、float
、double
、file
。Request(...)
方法用于尝试使用 URL 进行 HTTP 请求(GET、POST、POST-MULTIPARTFORMDATA)。HTTP 方法指示器有 3 种类型。InitializeCookies()
方法初始化 cookie 值。AddCookie(...)
方法添加 cookie 变量。W3Client::reqGet
是 HTTP GET 请求。W3Cient::reqPost
是 HTTP POST 请求。W3Client::reqPostMultiPartsFormData
是带有二进制表单数据的 HTTP POST 请求。
Response(...)
方法是您通过字节获得 HTTP 响应。QueryResult()
方法是您获得 HTTP 请求结果值。
异步 W3Client
SetCompleteRequest()
方法将完整的请求提交到AsyncW3Client
。WaitCompleteRequest()
方法等待请求完成。
用法
同步 HTTP GET
#include <iostream> #include "w3c.h" using namespace std; int main(int argc, char *argv[]){ W3Client w3; if(w3.Connect("http://google.com/")){ if(w3.Request("/")){ char buf[1024]="\0"; while(w3.Response(reinterpret_cast<unsigned char *>(buf), 1024)) cout << buf ; } w3.Close(); } return 0; }
同步 HTTP POST multipart/form-data
int main(int argc, char *argv[]){ W3Client client; if(client.Connect("http://gooshin.zzem.net/")){ client.AddPostArgument("f[]", "d:\\log1.txt", true); client.AddPostArgument("f[]", "d:\\log2.txt", true); client.AddPostArgument("f[]", "d:\\log3.txt", true); if(client.Request("/test.php", W3Client::reqPostMultipartsFormdata)){ char buf[1024]="\0"; while(client.Response(reinterpret_cast<unsigned char*>(buf), 1024)>0){ cout << buf << endl; memset(buf, 0x00, 1024); } } client.Close(); } return 0; }
异步 HTTP 客户端
#include <iostream> #include <net/w3c.h> #include <wt.h> #include <windows.h> using namespace std; CRITICAL_SECTION __cs; class AsDown : public AsyncW3Client, public IWORKERTHREAD { public: AsDown(unsigned int idx):AsyncW3Client(), IWORKERTHREAD(idx){} virtual ~AsDown(){} private: virtual void OnWork(){ while(true){ WaitCompleteRequest(); unsigned char buf[1024]="\0"; while(Response(buf, 1024)){ ::EnterCriticalSection(&__cs); cout << reinterpret_cast<char*>(buf); ::LeaveCriticalSection(&__cs); memset(buf, 0x00, 1024); } ::Sleep(500); } } }; void CALLBACK __getstatus( HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength ){ AsyncW3Client *pcontext=reinterpret_cast<AsyncW3Client*>(dwContext); unsigned long nbytes=0; ::EnterCriticalSection(&__cs); switch(dwInternetStatus){ case INTERNET_STATUS_SENDING_REQUEST: cout << "request sending..." << endl; break; case INTERNET_STATUS_REQUEST_SENT: { unsigned long *pnsent=(unsigned long*)lpvStatusInformation; cout << "bytes sent: " << *pnsent << endl; nbytes+=*pnsent; cout << "request sent..." << endl; } break; case INTERNET_STATUS_REQUEST_COMPLETE: { INTERNET_ASYNC_RESULT *pAsyncRes = (INTERNET_ASYNC_RESULT *)lpvStatusInformation; cout << "Function call finished" << endl; cout << "dwResult: " << pAsyncRes->dwResult << endl; cout << "dwError: " << pAsyncRes->dwError << endl; cout.flush(); pcontext->SetCompleteRequest(); cout << "request complete..." << endl; } break; } ::LeaveCriticalSection(&__cs); return; } int main(int argc, char *argv[]){ ::InitializeCriticalSection(&__cs); AsDown client(3); if(client.Connect("http://gooshin.zzem.net/", __getstatus)){ __wtstart(client); client.Request("/test.php"); Sleep(5000); client.InitializePostArguments(); client.AddPostArgument("f[]", "d:\\log1.txt", true); client.AddPostArgument("f[]", "d:\\log2.txt", true); client.AddPostArgument("f[]", "d:\\log3.txt", true); client.Request("/test.php", AsDown::reqPostMultipartsFormdata); Sleep(5000); client.InitializePostArguments(); client.AddPostArgument("f", "sss"); client.Request("/test2.php", AsDown::reqPost); Sleep(5000); __wtwait(client); client.Close(); } ::DeleteCriticalSection(&__cs); return 0; }