Click here to Skip to main content
14,329,217 members


Rate this:
4.04 (29 votes)
Please Sign up or sign in to vote.
4.04 (29 votes)
3 May 2004CPOL
Synchronized/asynchronized WWW client: HTTP/HTTPS GET, POST, POST multiparts/form-data supported. FTP GET FILE, PUT FILE supported too.


This class is used for HTTP/HTTPS request, and FTP request.

Supported methods are:

    1. GET
    2. POST
    3. POST multiparts/form-data
  • FTP
    1. GET FILE
    2. PUT FILE

Class Overview

// synchronized www client
 class W3Client {
  enum w3t { w3ftp, w3http, w3https };
  enum w3m { reqGet, reqPost, reqPostMultipartsFormdata };
  W3Client(){ _hOpen=NULL; _hConnection=NULL, _hRequest=NULL; }
  virtual ~W3Client(){ InitializePostArguments(); InitializeCookies();}
  // 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 {
  bool Connect(const char *szaddress,
            const char *szuser=NULL,
            const char *szpassword=NULL,
            const char *szagent=__W3_DEFAULT_AGENT);
  bool Connect(const char *szaddress, long nport,
          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){
   return W3Client::Response(buf, len);
  void SetCompleteRequest();
  bool WaitCompleteRequest(unsigned long ntime=INFINITE);
  1. Synchronized W3Client

    • Connect(...) method connects to HTTP server.
    • Close() method closes connection. These are used with RequestOfURI(...).
    • InitializePostArguments() method initializes POST arguments.
    • AddPostArgument(...) method is supported so that you can add new POST arguments of the following types: string, int, long, float, double, file.
    • Request(...) method is for you to attempt request for HTTP Request (GET, POST, POST-MULTIPARTFORMDATA) with URL. HTTP METHOD indirector has 3 types.
    • InitializeCookies() method initializes cookie values.
    • AddCookie(...) method adds cookie vars.
      • W3Client::reqGet is HTTP GET Request.
      • W3Cient::reqPost is HTTP POST Request.
      • W3Client::reqPostMultiPartsFormData is HTTP POST Request with BINARY FORM DATA.
    • Response(...) method is that you have HTTP Response by bytes.
    • QueryResult() method is you have receive HTTP Request result value.
  2. Asynchronized W3Client

    • SetCompleteRequest() method commits complete Request to AsyncW3Client.
    • WaitCompleteRequest() method waits for Request to be completed.


  1. Synchronized HTTP GET

    #include <iostream>
    #include "w3c.h"
    using namespace std;
    int main(int argc, char *argv[]){
      W3Client w3;
        char buf[1024]="\0";
        while(w3.Response(reinterpret_cast<unsigned char *>(buf), 1024))
         cout << buf ;
      return 0;
  2. Synchronized HTTP POST multiparts/form-data

    int main(int argc, char *argv[]){
     W3Client client;
      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);
     return 0;
  3. Asynchronized HTTP client

    #include <iostream>
    #include <net/w3c.h>
    #include <wt.h>
    #include <windows.h>
    using namespace std;
    class AsDown : public AsyncW3Client, public IWORKERTHREAD {
     AsDown(unsigned int idx):AsyncW3Client(), IWORKERTHREAD(idx){}
     virtual ~AsDown(){}
     virtual void OnWork(){
       unsigned char buf[1024]="\0";
       while(Response(buf, 1024)){
         cout << reinterpret_cast<char*>(buf);
         memset(buf, 0x00, 1024);
    void CALLBACK __getstatus(  HINTERNET hInternet,
                   DWORD_PTR dwContext,
                   DWORD dwInternetStatus,
                   LPVOID lpvStatusInformation,
                   DWORD dwStatusInformationLength
     AsyncW3Client *pcontext=reinterpret_cast<AsyncW3Client*>(dwContext);
     unsigned long nbytes=0;
      cout << "request sending..." << endl;
       unsigned long *pnsent=(unsigned long*)lpvStatusInformation;
       cout << "bytes sent: " << *pnsent << endl;
       cout << "request sent..." << endl;
       INTERNET_ASYNC_RESULT *pAsyncRes = 
              (INTERNET_ASYNC_RESULT *)lpvStatusInformation;
       cout << "Function call finished" << endl;
       cout << "dwResult: " << pAsyncRes->dwResult << endl;
       cout << "dwError:  " << pAsyncRes->dwError << endl;
        cout << "request complete..." << endl;  
    int main(int argc, char *argv[]){ 
     AsDown client(3);
     if(client.Connect("", __getstatus)){
      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);
      client.AddPostArgument("f", "sss");
      client.Request("/test2.php", AsDown::reqPost);  
     return 0;


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Heo Yongseon
Software Developer
Korea (Republic of) Korea (Republic of)
Poke tongue | ;-P

Comments and Discussions

GeneralRe: Unicode Version Pin
Heo Yongseon24-May-05 14:09
memberHeo Yongseon24-May-05 14:09 
GeneralRe: Unicode Version [modified] Pin
HongJin Kim13-Jun-06 16:52
memberHongJin Kim13-Jun-06 16:52 
GeneralCan't complie on VS.NET 2003 Pin
moshem10-May-05 6:55
membermoshem10-May-05 6:55 
GeneralRe: Can't complie on VS.NET 2003 Pin
Heo Yongseon10-May-05 14:28
memberHeo Yongseon10-May-05 14:28 
GeneralCGI Pin
Member 19248279-May-05 0:54
memberMember 19248279-May-05 0:54 
GeneralXML File Pin
Elizabete6-May-05 2:25
memberElizabete6-May-05 2:25 
GeneralRe: XML File Pin
Heo Yongseon8-May-05 15:09
memberHeo Yongseon8-May-05 15:09 
GeneralSend/Receive xml data Pin
achile0075-May-05 0:00
memberachile0075-May-05 0:00 
Should you explain me how I can use your class to send/receive xml data to a server.
thanks a lot
Generalworking with proxy server Pin
nguyendhex4-Apr-05 4:46
membernguyendhex4-Apr-05 4:46 
GeneralRe: working with proxy server Pin
Heo Yongseon10-Apr-05 1:37
memberHeo Yongseon10-Apr-05 1:37 
GeneralLooking for Cookies Help Pin
msttsm14-Feb-05 13:36
membermsttsm14-Feb-05 13:36 
Generalhttps sample Pin
Tinou20-Jan-05 5:07
memberTinou20-Jan-05 5:07 
GeneralRe: https sample Pin
StanSpielbusch21-Jan-05 10:43
memberStanSpielbusch21-Jan-05 10:43 
Generaltwo small requests Pin
ignac15-Dec-04 7:44
memberignac15-Dec-04 7:44 
GeneralRe: two small requests Pin
Heo Yongseon23-Dec-04 15:58
memberHeo Yongseon23-Dec-04 15:58 
GeneralHelp!Thank you Pin
alai25811-Dec-04 15:22
memberalai25811-Dec-04 15:22 
GeneralRe: Help!Thank you Pin
Heo Yongseon23-Dec-04 15:27
memberHeo Yongseon23-Dec-04 15:27 
GeneralUpload File Using Synchronised Post Pin
Griv28-Sep-04 16:51
memberGriv28-Sep-04 16:51 
Generalhttps for Request and Get Pin
mesamis14-Sep-04 2:44
membermesamis14-Sep-04 2:44 
GeneralRe: https for Request and Get Pin
Heo Yongseon14-Sep-04 14:47
memberHeo Yongseon14-Sep-04 14:47 
GeneralRe: https for Request and Get Pin
georgezhangca15-Nov-04 8:10
membergeorgezhangca15-Nov-04 8:10 
Generalfatal error LNK1104 Pin
ozgul4-Sep-04 4:53
memberozgul4-Sep-04 4:53 
GeneralRe: fatal error LNK1104 Pin
Heo Yongseon5-Sep-04 14:35
memberHeo Yongseon5-Sep-04 14:35 
Questionhow to deal with 404 error? Pin
quace19-Jul-04 0:22
memberquace19-Jul-04 0:22 
AnswerRe: how to deal with 404 error? Pin
Heo Yongseon19-Jul-04 14:03
memberHeo Yongseon19-Jul-04 14:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Posted 3 May 2004


93 bookmarked