|
|
-
- #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;
- }
-
-
|