您的位置:首页 > 运维架构 > Linux

c++ 写的linux下简单的实现 get post 请求

2006-07-13 18:54 651 查看
简单的一个webclient,用来交互数据用.

[align=left]#ifndef MWEBCLIENT_H_[/align]
[align=left]#define MWEBCLIENT_H_[/align]
[align=left] [/align]
[align=left]class MWebClient[/align]
[align=left]{[/align]
[align=left]public:[/align]
[align=left] MWebClient();[/align]
[align=left] [/align]
[align=left] //成功返回0,数据保存在responseBuf中[/align]
[align=left] intdoGet(constchar* getUrl,MStringBuffer & responseBuf);[/align]
[align=left] intdoPost(constchar* postUrl,constchar* data,MStringBuffer & responseBuf);[/align]
[align=left] voidsetTimeOut(int seconds);[/align]
[align=left] [/align]
[align=left]protected:[/align]
[align=left] intdoRequest(constchar* ip,MStringBuffer & request,MStringBuffer & responseBuf);[/align]
[align=left]private: [/align]
[align=left] int m_port;[/align]
[align=left] int m_outtime_second;[/align]
[align=left]};[/align]
[align=left]#endif /*MWEBCLIENT_H_*/[/align]
[align=left]#include "MAll.h"[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]MWebClient::MWebClient()[/align]
[align=left]{[/align]
[align=left] m_port =80;[/align]
[align=left] m_outtime_second =10;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]void MWebClient::setTimeOut(int seconds)[/align]
[align=left]{[/align]
[align=left] m_outtime_second = seconds;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]int MWebClient::doRequest(constchar* ip,MStringBuffer & request,MStringBuffer & responseBuf)[/align]
[align=left]{[/align]
[align=left] int search_socket =-1;[/align]
[align=left] struct sockaddr_in search_server;[/align]
[align=left] int retval =0, tmp_val =0;[/align]
[align=left] struct timeval tv;[/align]
[align=left] search_socket =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);[/align]
[align=left] if(-1== search_socket )[/align]
[align=left] {[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 设置地址可重用[/align]
[align=left] tmp_val =1;[/align]
[align=left] retval =setsockopt(search_socket, SOL_SOCKET, SO_REUSEADDR, &tmp_val, sizeof(tmp_val));[/align]
[align=left] if( retval !=0 )[/align]
[align=left] {[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] return-(__LINE__);[/align]
[align=left] } [/align]
[align=left] [/align]
[align=left] // 设置超时参数[/align]
[align=left] int tSec = m_outtime_second;[/align]
[align=left] int tUsec =0;[/align]
[align=left] if(tUsec<0)[/align]
[align=left] {[/align]
[align=left] tUsec =0;[/align]
[align=left] }[/align]
[align=left] tv.tv_sec = tSec;[/align]
[align=left] tv.tv_usec = tUsec;[/align]
[align=left] [/align]
[align=left] retval =setsockopt( search_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));[/align]
[align=left] if( retval !=0 )[/align]
[align=left] {[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] retval =setsockopt( search_socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));[/align]
[align=left] if( retval !=0 )[/align]
[align=left] {[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] memset((char*) &search_server, 0, sizeof(search_server));[/align]
[align=left] search_server.sin_family = AF_INET;[/align]
[align=left] search_server.sin_port =htons(m_port);[/align]
[align=left] search_server.sin_addr.s_addr =inet_addr(ip);[/align]
[align=left] retval =connect( search_socket, (struct sockaddr *) &search_server, sizeof(search_server) );[/align]
[align=left] if( retval !=0 )[/align]
[align=left] {[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] retval =write( search_socket, request.toCString(),request.length());[/align]
[align=left] if(-1== retval )[/align]
[align=left] {[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] char strBuf[1024];[/align]
[align=left] // int flag = 0;[/align]
[align=left] // int len = 0;[/align]
[align=left] while(true){[/align]
[align=left] retval =read(search_socket,strBuf,sizeof(strBuf));[/align]
[align=left] //printf("recv[%d]/n",retval);[/align]
[align=left] if(retval>0)[/align]
[align=left] {[/align]
[align=left] responseBuf.append(strBuf,retval);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] if(retval<(int)sizeof(strBuf))[/align]
[align=left] {[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] close( search_socket );[/align]
[align=left] search_socket =-1;[/align]
[align=left] [/align]
[align=left] return0;[/align]
[align=left]}[/align]
[align=left]int MWebClient::doPost(constchar* getUrl,constchar* data,MStringBuffer & responseBuf)[/align]
[align=left]{[/align]
[align=left] char hostname[64];[/align]
[align=left] char getstr[512];[/align]
[align=left] char ip[64];[/align]
[align=left] char tmpGetUrl[512];[/align]
[align=left] strncpy(tmpGetUrl,getUrl,sizeof(tmpGetUrl)-1);[/align]
[align=left] char* tmpP;[/align]
[align=left] tmpP =strstr(tmpGetUrl,"http://");[/align]
[align=left] if(tmpP!=NULL)[/align]
[align=left] {[/align]
[align=left] tmpP = tmpP+7;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] tmpP = tmpGetUrl;[/align]
[align=left] }[/align]
[align=left] char* tmpP2;[/align]
[align=left] tmpP2 =strstr(tmpP,"/");[/align]
[align=left] if(tmpP2!=NULL)[/align]
[align=left] {[/align]
[align=left] if(tmpP2-tmpP>=(int)sizeof(hostname))[/align]
[align=left] {[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] memcpy(hostname,tmpP,tmpP2-tmpP);[/align]
[align=left] hostname[tmpP2-tmpP] ='/0';[/align]
[align=left] strncpy(getstr,tmpP2,sizeof(getstr)-1);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] strncpy(hostname,tmpP,sizeof(hostname)-1);[/align]
[align=left] getstr[0] ='/';[/align]
[align=left] getstr[1] ='/0';[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] struct hostent * hostPtr;[/align]
[align=left] hostPtr =gethostbyname(hostname);[/align]
[align=left] if(hostPtr==NULL)[/align]
[align=left] {[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] struct in_addr * addrPtr;[/align]
[align=left] addrPtr =(struct in_addr *) *(hostPtr->h_addr_list);[/align]
[align=left] strncpy(ip,inet_ntoa(*addrPtr),sizeof(ip)-1);[/align]
[align=left] //printf("ip:[%s]/n",ip);[/align]
[align=left] [/align]
[align=left] MStringBuffer request;[/align]
[align=left] request.append("POST ").append(getstr).append(" HTTP/1.1").append("/r/n");[/align]
[align=left] request.append("Accept: */*").append("/r/n");[/align]
[align=left] request.append("Content-Type: application/x-www-form-urlencoded").append("/r/n");[/align]
[align=left] request.append("Referer: ").append(getUrl).append("/r/n");[/align]
[align=left] request.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)").append("/r/n");[/align]
[align=left] request.append("Host: ").append(hostname).append("/r/n");[/align]
[align=left] request.append("Content-Length: ").append(strlen(data)).append("/r/n");[/align]
[align=left] request.append("Connection: Keep-Alive").append("/r/n");[/align]
[align=left] request.append("/r/n");[/align]
[align=left] request.append(data);[/align]
[align=left] request.append("/r/n");[/align]
[align=left] request.append("/r/n");[/align]
[align=left] [/align]
[align=left] //printf("request=[%s]/n",request.toCString());[/align]
[align=left] returndoRequest(ip,request,responseBuf);[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]int MWebClient::doGet(constchar* getUrl,MStringBuffer & responseBuf)[/align]
[align=left]{[/align]
[align=left] char hostname[64];[/align]
[align=left] char getstr[512];[/align]
[align=left] char ip[64];[/align]
[align=left] char tmpGetUrl[512];[/align]
[align=left] strncpy(tmpGetUrl,getUrl,sizeof(tmpGetUrl)-1);[/align]
[align=left] char* tmpP;[/align]
[align=left] tmpP =strstr(tmpGetUrl,"http://");[/align]
[align=left] if(tmpP!=NULL)[/align]
[align=left] {[/align]
[align=left] tmpP = tmpP+7;[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] tmpP = tmpGetUrl;[/align]
[align=left] }[/align]
[align=left] char* tmpP2;[/align]
[align=left] tmpP2 =strstr(tmpP,"/");[/align]
[align=left] if(tmpP2!=NULL)[/align]
[align=left] {[/align]
[align=left] if(tmpP2-tmpP>=(int)sizeof(hostname))[/align]
[align=left] {[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] memcpy(hostname,tmpP,tmpP2-tmpP);[/align]
[align=left] hostname[tmpP2-tmpP] ='/0';[/align]
[align=left] strncpy(getstr,tmpP2,sizeof(getstr)-1);[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] strncpy(hostname,tmpP,sizeof(hostname)-1);[/align]
[align=left] getstr[0] ='/';[/align]
[align=left] getstr[1] ='/0';[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] struct hostent * hostPtr;[/align]
[align=left] hostPtr =gethostbyname(hostname);[/align]
[align=left] if(hostPtr==NULL)[/align]
[align=left] {[/align]
[align=left] return-(__LINE__);[/align]
[align=left] }[/align]
[align=left] struct in_addr * addrPtr;[/align]
[align=left] addrPtr =(struct in_addr *) *(hostPtr->h_addr_list);[/align]
[align=left] strncpy(ip,inet_ntoa(*addrPtr),sizeof(ip)-1);[/align]
[align=left] //printf("ip:[%s]/n",ip);[/align]
[align=left] [/align]
[align=left] MStringBuffer request;[/align]
[align=left] request.append("GET ").append(getstr).append(" HTTP/1.1").append("/r/n");[/align]
[align=left] request.append("Accept: */*").append("/r/n");[/align]
[align=left] request.append("Referer: ").append(getUrl).append("/r/n");[/align]
[align=left] request.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)").append("/r/n");[/align]
[align=left] request.append("Host: ").append(hostname).append("/r/n");[/align]
[align=left] request.append("Connection: Keep-Alive").append("/r/n");[/align]
[align=left] request.append("/r/n");[/align]
[align=left] [/align]
[align=left] //printf("request=[%s]/n",request.toCString());[/align]
[align=left] returndoRequest(ip,request,responseBuf);[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]-------------------------- MStringBuffer------------------------------[/align]
[align=left] [/align]
[align=left]一个类似string的字符缓存类,可以简单的实现一个.或用string替换.[/align]
[align=left][/align]
[align=left]return-(__LINE__);(又偷懒了一次,因为这边的错误码,不是我所关心的.)[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: