|
|
#include <iostream>
|
|
#include<event2/event.h>
|
|
#include <event2/listener.h>
|
|
#include <event2/http.h>
|
|
#include <event2/listener.h>
|
|
#include <event2/buffer.h>
|
|
#include <event2/bufferevent.h>
|
|
#include <string.h>
|
|
#ifndef _WIN32
|
|
#include <signal.h>
|
|
#endif // !_WIN32
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
void http_client_cb(struct evhttp_request *req, void *ctx) {
|
|
cout << "http_client_cb" << endl;
|
|
bufferevent *bev = (bufferevent*)ctx;
|
|
if (req == NULL) {
|
|
int errcode = EVUTIL_SOCKET_ERROR();
|
|
cout << "socket error: " << evutil_socket_error_to_string(errcode) << endl;
|
|
return;
|
|
}
|
|
|
|
//获取path
|
|
const char* path = evhttp_request_get_uri(req);
|
|
cout << "request path is " << path << endl;
|
|
|
|
//获取返回的code
|
|
cout << "Respone: " << evhttp_request_get_response_code(req);
|
|
cout << "" << evhttp_request_get_response_code_line(req) << endl;
|
|
char buf[1024] = { 0 };
|
|
evbuffer *input = evhttp_request_get_input_buffer(req);
|
|
for (;;) {
|
|
int len = evbuffer_remove(input,buf,sizeof(buf)-1);
|
|
if(len <=0 )
|
|
buf[len] = 0;
|
|
}
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
#ifdef _WIN32
|
|
//初始化socket库
|
|
WSADATA wsa;
|
|
WSAStartup(MAKEWORD(2, 2), &wsa);
|
|
#else
|
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { //忽略管道信号,发送数据给已关闭的socket,会飞掉!
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
//创建libevent上下文
|
|
event_base* base = event_base_new();
|
|
|
|
// 生成请求信息 GET
|
|
//string http_url = "http://www.pyfup.com/index.html?id=1";
|
|
string http_url = "http://121.4.70.4:3000//index.html?id=1"; //地址 自己换着测试
|
|
|
|
evhttp_uri *uri = evhttp_uri_parse(http_url.c_str());
|
|
const char* schemo = evhttp_uri_get_scheme(uri);
|
|
if (!schemo) {
|
|
cerr << "schemo is null" << endl;
|
|
return -1;
|
|
}
|
|
cout << "schemo is " << schemo << endl;
|
|
|
|
int port = evhttp_uri_get_port(uri);
|
|
if (port < 0) {
|
|
if (strcmp(schemo, "http") == 0)
|
|
port = 80;
|
|
}
|
|
|
|
cout << "host is " << port << endl;
|
|
|
|
const char* host = evhttp_uri_get_host(uri);
|
|
if (!host) {
|
|
cerr << "host is null" << endl;
|
|
return -1;
|
|
}
|
|
|
|
cout << "host is " << host << endl;
|
|
const char *path = evhttp_uri_get_path(uri);
|
|
if (!path || strlen(path) == 0) {
|
|
path = "/";
|
|
}
|
|
cout << "path is " << path << endl;
|
|
|
|
|
|
|
|
//?号之后的内容
|
|
const char* query = evhttp_uri_get_query(uri);
|
|
if (query) {
|
|
cout << "query is " << query << endl;
|
|
}
|
|
|
|
|
|
bufferevent *bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
|
|
evhttp_connection *evcon = evhttp_connection_base_bufferevent_new(base, NULL, bev, host, port);
|
|
evhttp_request *req = evhttp_request_new(http_client_cb, bev);
|
|
|
|
//设置请求的head 消息报头 信息
|
|
struct evkeyvalq*out_put_headers = evhttp_request_get_output_headers(req);
|
|
evhttp_add_header(out_put_headers, "Host", host);
|
|
|
|
//发起请求
|
|
evhttp_make_request(evcon, req, EVHTTP_REQ_GET, path);
|
|
|
|
|
|
|
|
|
|
if (base)
|
|
event_base_dispatch(base); //事件分发处理
|
|
|
|
if (base)
|
|
event_base_free(base);
|
|
|
|
#if _WIN32
|
|
WSACleanup();
|
|
#endif // _WIN32
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|