c++下连接网络并使用post方法获取数据

2013年7月29日 分类: C++, 编程 (904 个脚步)

由于某种原因,需要在c++下使用网络将内容获取下来,然后将返回的json数据转换成别的类型输出。

首先是需要将网络上的数据使用post的方法将内容取下来。
下面就是C++的代码:

/* 
* Notes:
* This source demonstrates sending HTTP POST request to webserver from C++
* This uses sockets hence can be compiled on Linux, UNIX, Win
*/
#define LINUX_OS
// #define WIN_OS
#define _DEBUG_PRINT(X)   /* X */
//For commn
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#ifdef LINUX_OS
#include <netdb.h>
#endif
#ifdef WIN_OS
#include <Winsock2.h>
#endif

#define SEND_RQ(MSG) \
/*cout<<send_str;*/ \
send(sock,MSG,strlen(MSG),0);

using namespace std;
//<exe> hostname api parameters
int request (char* hostname, char* api, char* parameters, string& message){
	#ifdef WIN_OS
	{
	   WSADATA        WsaData;
	   WSAStartup (0x0101, &WsaData);
	}
	#endif

    sockaddr_in       sin;
    int sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
		return -100;
	}
    sin.sin_family = AF_INET;
    sin.sin_port = htons( (unsigned short)80);

    struct hostent * host_addr = gethostbyname(hostname);
    if(host_addr==NULL) {
		_DEBUG_PRINT( cout<<"Unable to locate host"<<endl );
	   	return -103;
    }
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ;
    _DEBUG_PRINT( cout<<"Port :"<<sin.sin_port<<", Address : "<< sin.sin_addr.s_addr<<endl);

    if( connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1 ) {
   		_DEBUG_PRINT( cout<<"connect failed"<<endl ) ;
   		return -101;
    }

	string send_str;

	SEND_RQ("POST ");
	SEND_RQ(api);
	SEND_RQ(" HTTP/1.0\r\n");
	SEND_RQ("Accept: */*\r\n");
	SEND_RQ("User-Agent: Mozilla/4.0\r\n");

	char content_header[100];
	sprintf(content_header,"Content-Length: %d\r\n",strlen(parameters));
	SEND_RQ(content_header);
	SEND_RQ("Accept-Encoding: gzip, deflate\r\n");
	SEND_RQ("Host: ");
	SEND_RQ(hostname);
	SEND_RQ("\r\n");
	SEND_RQ("Content-Type: application/x-www-form-urlencoded\r\n");
	SEND_RQ("Connection: Keep-Alive\r\n");

	SEND_RQ("\r\n"); //只需要一个空行!
	SEND_RQ(parameters);

	_DEBUG_PRINT(cout<<"####HEADER####"<<endl);
	char c1[1];
	int l,line_length;
	bool loop = true;
	bool bHeader = false;

	while(loop) {
		l = recv(sock, c1, 1, 0);
	   	if(l<0) loop = false;
	   	if(c1[0]=='\n') {
	    	if(line_length == 0) 
				loop = false;
	    	line_length = 0;
	    	if(message.find("200") != string::npos)
	     		bHeader = true;	   
		}
		else if(c1[0]!='\r') 
			line_length++;
	   _DEBUG_PRINT( cout<<c1[0]);
	   message += c1[0];
	}

	message="";
	if(bHeader) {	  
		_DEBUG_PRINT( cout<<"####BODY####"<<endl) ;
	   	char p[1024];
		while((l = recv(sock,p,1023,0)) > 0) {
	    	_DEBUG_PRINT( cout.write(p,l)) ;
	    	p[l] = '\0';
	    	message += p;
	   	}
	   	cout << message << endl;
	} else {
		return -102;
	}

	#ifdef WIN_OS
	WSACleanup( );
	#endif

	return 0;
}

int main(){
	string message="";
	request ("blog.shiniv.com", "/api.php?mod=recent", "type=more", message);
}

 

c++下连接网络并使用post方法获取数据 【声明】本文 c++下连接网络并使用post方法获取数据 为柠之漠然原创文章,转载请注明出自 枫之落叶
并保留本文有效链接:https://blog.shiniv.com/2013/07/cpp-use-post-get-data/ , 转载请保留本声明!

标签:
目前还没有任何评论.
你必须要启用 Javascript