纯C++的Socket访问Http封装类

纯C++的Socket访问Http封装类

1.项目中要使用c++++来访问Web服务器,从网上找了个C++的封装类,其中调用了MFC,在VC2005上用能用,但是移植到VC2003就出问题了,干脆修改成了纯C++的,不敢独享,share之。

2.以下是调用方法:

 1 #include "stdafx.h" 
 2 #include <iostream> 
 3 #include <string> 
 4 #include "http\request.h" 
 5  
 6 using namespace std; 
 7  
 8 int _tmain(int argc, _TCHAR* argv[]) 
 9 
10     Request myRequest;      //初始化类 
11     string sHeaderSend;     //定义http头 
12     string sHeaderReceive;  //返回头 
13     string sMessage="";     //返回页面内容 
14     bool IsPost=false;  //是否Post提交 
15  
16     int i =myRequest.SendRequest(IsPost, "http://neeao.com", sHeaderSend, 
17                                  sHeaderReceive, sMessage); 
18     if (i) 
19     {    
20         cout<<"Http头:"<<endl; 
21         cout<< sHeaderSend <<endl; 
22         cout<<"响应头"<<endl; 
23         cout<< sHeaderReceive <<endl; 
24         cout<<"网页内容"<<endl; 
25         cout<< sMessage <<endl; 
26     }else 
27     { 
28         cout<<"网络不可到达"<<endl; 
29     } 
30     system("pause"); 
31     return 0
32 
33 

直接上代码了,

Request.h

 1 //******************************************  
 2 //纯C++的socket访问Http封装类,Neeao修改  
 3 //http://neeao.com  
 4 //2009-08-25  
 5 //******************************************  
 6  
 7 #if !defined(AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_)  
 8 #define AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_  
 9  
10 #if _MSC_VER > 1000  
11 #pragma once  
12 #endif // _MSC_VER > 1000  
13  
14  
15 #include <stdio.h>  
16 #include <stdlib.h>  
17 #include <string.h>  
18 #include <winsock2.h>  
19 #pragma comment(lib, "WS2_32")   
20  
21 using namespace std;  
22 #define MEM_BUFFER_SIZE 10  
23  
24 /*   
25     HTTPRequest: Structure that returns the HTTP headers and message  
26                     from the request  
27 */  
28 typedef struct 
29 {   
30     LPSTR headerSend;                               // Pointer to HTTP header Send   
31     LPSTR headerReceive;                            // Pointer to HTTP headers Receive  
32     LPSTR message;                                  // Pointer to the HTTP message   
33     long messageLength;                             // Length of the message   
34 } HTTPRequest;  
35  
36 /*   
37     MemBuffer:  Structure used to implement a memory buffer, which is a  
38                 buffer of memory that will grow to hold variable sized  
39                 parts of the HTTP message.   
40 */ 
41 typedef struct 
42 {  
43     unsigned    char *buffer;  
44     unsigned    char *position;  
45     size_t      size;  
46 } MemBuffer;  
47  
48  
49 class Request    
50 {  
51 public:  
52     Request();  
53     virtual ~Request();  
54  
55 private:  
56     void        MemBufferCreate(MemBuffer *b);  
57     void        MemBufferGrow(MemBuffer *b);  
58     void        MemBufferAddByte(MemBuffer *b, unsigned char byt);  
59     void        MemBufferAddBuffer(MemBuffer *b, unsigned char *buffer, size_t size);  
60     DWORD       GetHostAddress(LPCSTR host);  
61     void        SendString(SOCKET sock,LPCSTR str);  
62     BOOL        ValidHostChar(char ch);  
63     void        ParseURL(string url,LPSTR protocol,int lprotocol, LPSTR host,int lhost,LPSTR request,int lrequest,int *port);  
64  
65     int         SendHTTP(string url,LPCSTR headerReceive,BYTE *post, DWORD postLength,HTTPRequest *req);  
66  
67 public:  
68     int     SendRequest(bool IsPost, string url, string& psHeaderSend, string& pszHeaderReceive,string& pszMessage);  
69 };  
70  
71 #endif // !defined(AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_)  
72 

 

Request.cpp

  1 //******************************************  
  2 //纯C++的Socket访问Http封装类,Neeao修改  
  3 //http://neeao.com  
  4 //2009-08-25  
  5 //******************************************  
  6  
  7  
  8 #include "stdafx.h"  
  9 #include "Request.h"  
 10 #include <string>  
 11 #ifdef _DEBUG  
 12 #undef THIS_FILE  
 13 static char THIS_FILE[]=__FILE__;  
 14 #define new DEBUG_NEW  
 15 #endif  
 16  
 17  
 18 //////////////////////////////////////////////////////////////////////  
 19 // Construction/Destruction  
 20 //////////////////////////////////////////////////////////////////////  
 21  
 22 Request::Request()  
 23 {  
 24  
 25 }  
 26  
 27 Request::~Request()  
 28 {  
 29  
 30 }  
 31  
 32  
 33 //*******************************************************************************************************  
 34 //MemBufferCreate:   
 35 //                  Passed a MemBuffer structure, will allocate a memory buffer   
 36 //                   of MEM_BUFFER_SIZE.  This buffer can then grow as needed.  
 37 //*******************************************************************************************************  
 38 void Request::MemBufferCreate(MemBuffer *b)  
 39 {  
 40     b->size = MEM_BUFFER_SIZE;  
 41     b->buffer =(unsigned    char *) malloc( b->size );  
 42     b->position = b->buffer;  
 43 }  
 44  
 45 //*******************************************************************************************************  
 46 // MemBufferGrow:    
 47 //                  Double the size of the buffer that was passed to this function.   
 48 //*******************************************************************************************************  
 49 void Request::MemBufferGrow(MemBuffer *b)  
 50 {  
 51     size_t sz;  
 52     sz = b->position - b->buffer;  
 53     b->size = b->size *2;  
 54     b->buffer =(unsigned    char *) realloc(b->buffer,b->size);  
 55     b->position = b->buffer + sz;   // readjust current position  
 56 }  
 57  
 58 //*******************************************************************************************************  
 59 // MemBufferAddByte:   
 60 //                  Add a single byte to the memory buffer, grow if needed.  
 61 //*******************************************************************************************************  
 62 void Request::MemBufferAddByte(MemBuffer *b,unsigned char byt)  
 63 {  
 64     if( (size_t)(b->position-b->buffer) >= b->size )  
 65         MemBufferGrow(b);  
 66  
 67     *(b->position++= byt;  
 68 }  
 69  
 70 //*******************************************************************************************************  
 71 // MemBufferAddBuffer:  
 72 //                  Add a range of bytes to the memory buffer, grow if needed.  
 73 //*******************************************************************************************************  
 74 void Request::MemBufferAddBuffer(MemBuffer *b,  
 75                                  unsigned char *buffer, size_t size)  
 76 {  
 77     while( ((size_t)(b->position-b->buffer)+size) >= b->size )  
 78         MemBufferGrow(b);  
 79  
 80     memcpy(b->position,buffer,size);  
 81     b->position+=size;  
 82 }  
 83  
 84 //*******************************************************************************************************  
 85 // GetHostAddress:   
 86 //                  Resolve using DNS or similar(WINS,etc) the IP   
 87 //                   address for a domain name such as www.wdj.com.   
 88 //*******************************************************************************************************  
 89 DWORD Request::GetHostAddress(LPCSTR host)  
 90 {  
 91     struct hostent *phe;  
 92     char *p;  
 93  
 94     phe = gethostbyname( host );  
 95  
 96     if(phe==NULL)  
 97         return 0;  
 98  
 99     p = *phe->h_addr_list;  
100     return *((DWORD*)p);  
101 }  
102  
103 //*******************************************************************************************************  
104 // SendString:   
105 //                  Send a string(null terminated) over the specified socket.  
106 //*******************************************************************************************************  
107 void Request::SendString(SOCKET sock,LPCSTR str)  
108 {  
109     send(sock,str,strlen(str),0);  
110 }  
111  
112 //*******************************************************************************************************  
113 // ValidHostChar:   
114 //                  Return TRUE if the specified character is valid  
115 //                      for a host name, i.e. A-Z or 0-9 or -.:   
116 //*******************************************************************************************************  
117 BOOL Request::ValidHostChar(char ch)  
118 {  
119     return( isalpha(ch) || isdigit(ch)  
120         || ch=='-' || ch=='.' || ch==':' );  
121 }  
122  
123  
124 //*******************************************************************************************************  
125 // ParseURL:   
126 //                  Used to break apart a URL such as   
127 //                      http://www.localhost.com:80/TestPost.htm into protocol, port, host and request.  
128 //*******************************************************************************************************  
129 void Request::ParseURL(string url,LPSTR protocol,int lprotocol,LPSTR host,int lhost,LPSTR request,int lrequest,int *port)  
130 {  
131     char *work,*ptr,*ptr2;  
132  
133     *protocol = *host = *request = 0;  
134     *port=80;  
135  
136     work = strdup(url.c_str());  
137     strupr(work);  
138  
139     ptr = strchr(work,':');                         // find protocol if any  
140     if(ptr!=NULL)  
141     {  
142         *(ptr++= 0;  
143         lstrcpyn(protocol,work,lprotocol);  
144     }  
145     else 
146     {  
147         lstrcpyn(protocol,"HTTP",lprotocol);  
148         ptr = work;  
149     }  
150  
151     if( (*ptr=='/'&& (*(ptr+1)=='/') )            // skip past opening /'s   
152         ptr+=2;  
153  
154     ptr2 = ptr;                                     // find host  
155     while( ValidHostChar(*ptr2) && *ptr2 )  
156         ptr2++;  
157  
158     *ptr2=0;  
159     lstrcpyn(host,ptr,lhost);  
160  
161     lstrcpyn(request,url.c_str() + (ptr2-work),lrequest);   // find the request  
162  
163     ptr = strchr(host,':');                         // find the port number, if any  
164     if(ptr!=NULL)  
165     {  
166         *ptr=0;  
167         *port = atoi(ptr+1);  
168     }  
169  
170     free(work);  
171 }  
172  
173 //*******************************************************************************************************  
174 // SendHTTP:   
175 //                  Main entry point for this code.    
176 //                    url           - The URL to GET/POST to/from.  
177 //                    headerSend        - Headers to be sent to the server.  
178 //                    post          - Data to be posted to the server, NULL if GET.  
179 //                    postLength    - Length of data to post.  
180 //                    req           - Contains the message and headerSend sent by the server.  
181 //  
182 //                    returns 1 on failure, 0 on success.  
183 //*******************************************************************************************************  
184 int Request::SendHTTP(string url,LPCSTR headerReceive,BYTE *post,  
185                       DWORD postLength,HTTPRequest *req)  
186 {  
187     WSADATA         WsaData;  
188     SOCKADDR_IN     sin;  
189     SOCKET          sock;  
190     char            buffer[512];  
191     char            protocol[20],host[256],request[1024];  
192     int             l,port,chars,err;  
193     MemBuffer       headersBuffer,messageBuffer;  
194     char            headerSend[1024];  
195     BOOL            done;  
196  
197  
198  
199  
200     ParseURL(url,protocol,sizeof(protocol),host,sizeof(host),       // Parse the URL  
201         request,sizeof(request),&port);  
202     if(strcmp(protocol,"HTTP"))  
203         return 1;  
204  
205     err = WSAStartup (0x0101&WsaData);                            // Init Winsock  
206     if(err!=0)  
207         return 1;  
208  
209     sock = socket (AF_INET, SOCK_STREAM, 0);  
210     //if (socket == INVALID_SOCKET)  
211     if (sock == INVALID_SOCKET)  
212     {  
213         return 1;  
214     }  
215  
216     sin.sin_family = AF_INET;                                       //Connect to web sever  
217     sin.sin_port = htons( (unsigned short)port );  
218     sin.sin_addr.s_addr = GetHostAddress(host);  
219  
220     if( connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN) ) )  
221     {  
222  
223         return 1;  
224     }  
225  
226  
227     if!*request )  
228         lstrcpyn(request,"/",sizeof(request));  
229  
230     if( post == NULL )  
231     {  
232         SendString(sock,"GET ");  
233         strcpy(headerSend, "GET ");  
234     }  
235     else   
236     {  
237         SendString(sock,"POST ");  
238         strcpy(headerSend, "POST ");  
239     }  
240     SendString(sock,request);  
241     strcat(headerSend, request);  
242  
243     SendString(sock," HTTP/1.0\r\n");  
244     strcat(headerSend, " HTTP/1.0\r\n");  
245  
246     SendString(sock,"Accept: image/gif, image/x-xbitmap," 
247         " image/jpeg, image/pjpeg, application/vnd.ms-excel," 
248         " application/msword, application/vnd.ms-powerpoint," 
249         " */*\r\n");  
250     strcat(headerSend, "Accept: image/gif, image/x-xbitmap," 
251         " image/jpeg, image/pjpeg, application/vnd.ms-excel," 
252         " application/msword, application/vnd.ms-powerpoint," 
253         " */*\r\n");  
254  
255     SendString(sock,"Accept-Language: en-us\r\n");  
256     strcat(headerSend, "Accept-Language: en-us\r\n");  
257  
258     SendString(sock,"Accept-Encoding: gzip, default\r\n");  
259     strcat(headerSend, "Accept-Encoding: gzip, default\r\n");  
260  
261     SendString(sock,"User-Agent: Neeao/4.0\r\n");  
262     strcat(headerSend, "User-Agent: Neeao/4.0\r\n");  
263  
264     if(postLength)  
265     {  
266         sprintf(buffer,"Content-Length: %ld\r\n",postLength);  
267         SendString(sock,buffer);  
268         strcat(headerSend, buffer);  
269     }  
270     //SendString(sock,"Cookie: mycookie=blablabla\r\n");  
271     //  printf("Cookie: mycookie=blablabla\r\n");  
272     SendString(sock,"Host: ");  
273     strcat(headerSend, "Host: ");  
274  
275     SendString(sock,host);  
276     strcat(headerSend, host);  
277  
278     SendString(sock,"\r\n");  
279     strcat(headerSend, "\r\n");  
280  
281     if( (headerReceive!=NULL) && *headerReceive )  
282     {  
283         SendString(sock,headerReceive);  
284         strcat(headerSend, headerReceive);  
285     }  
286  
287     SendString(sock,"\r\n");                                // Send a blank line to signal end of HTTP headerReceive  
288     strcat(headerSend, "\r\n");  
289  
290     if( (post!=NULL) && postLength )  
291     {  
292         send(sock,(const char*)post,postLength,0);  
293         post[postLength]    = '\0';  
294  
295         strcat(headerSend, (const char*)post);  
296     }  
297  
298     //strcpy(req->headerSend, headerSend);  
299     req->headerSend     = (char*) malloc( sizeof(char** strlen(headerSend));  
300     strcpy(req->headerSend, (char*) headerSend );  
301  
302  
303     MemBufferCreate(&headersBuffer );  
304     chars = 0;  
305     done = FALSE;  
306  
307     while(!done)  
308     {  
309         l = recv(sock,buffer,1,0);  
310         if(l<0)  
311             done=TRUE;  
312  
313         switch(*buffer)  
314         {  
315         case '\r':  
316             break;  
317         case '\n':  
318             if(chars==0)  
319                 done = TRUE;  
320             chars=0;  
321             break;  
322         default:  
323             chars++;  
324             break;  
325         }  
326  
327         MemBufferAddByte(&headersBuffer,*buffer);  
328     }  
329  
330     req->headerReceive  = (char*) headersBuffer.buffer;  
331     *(headersBuffer.position) = 0;  
332  
333  
334  
335     MemBufferCreate(&messageBuffer);                            // Now read the HTTP body  
336  
337     do 
338     {  
339         l = recv(sock,buffer,sizeof(buffer)-1,0);  
340         if(l<0)  
341             break;  
342         *(buffer+l)=0;  
343         MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);  
344     } while(l>0);  
345     *messageBuffer.position = 0;  
346     req->message = (char*) messageBuffer.buffer;  
347     req->messageLength = (messageBuffer.position - messageBuffer.buffer);  
348  
349  
350     closesocket(sock);                                          // Cleanup  
351  
352     return 0;  
353 }  
354  
355  
356 //*******************************************************************************************************  
357 // SendRequest  
358 //  
359 //*******************************************************************************************************  
360 int Request::SendRequest(bool IsPost, string url, string& psHeaderSend, string& psHeaderReceive, string& psMessage)  
361 {  
362     HTTPRequest         req;  
363     int                 i,rtn;  
364     LPSTR               buffer;  
365  
366     req.headerSend                          = NULL;  
367     req.headerReceive                       = NULL;  
368     req.message                             = NULL;  
369  
370     //Read in arguments  
371  
372  
373     if(IsPost)  
374     {                                                   /* POST */  
375         i       = psHeaderSend.length();  
376         buffer  = (char*) malloc(i+1);  
377         strcpy(buffer, psHeaderSend.c_str());  
378  
379         rtn             = SendHTTP( url,  
380             "Content-Type: application/x-www-form-urlencoded\r\n",  
381             (unsigned char*)buffer,  
382             i,  
383             &req);  
384  
385         free(buffer);  
386     }  
387     else/* GET */ 
388     {  
389         rtn = SendHTTP(url,NULL,NULL,0,&req);  
390     }  
391  
392  
393  
394     if(!rtn)                                            //Output message and/or headerSend   
395     {  
396         psHeaderSend        = req.headerSend;  
397         psHeaderReceive     = req.headerReceive;  
398         psMessage           = req.message;  
399  
400  
401         free(req.headerSend);  
402         free(req.headerReceive);  
403         free(req.message);  
404         return 1;  
405     }  
406     else 
407     {  
408         return 0;  
409     }  
410 
411 

 

posted @ 2009-11-17 11:59  clown  阅读(3412)  评论(0编辑  收藏  举报