#include #include #include #include #include #include #include #include #ifndef _WIN32 #include #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; }