libevent10: HttpClient

使用Libevent 创建一个简单Http客户端,并实现解析响应请求数据。

代码地址:
http://121.4.70.4:3000/adminPyf/libevent_study.git libevent_study/test_http_client
支持linux 、windows

代码都很简单 跑一遍就知道

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



libevent10: HttpClient

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动到顶部