基于libevent的http协议 学习笔记之认识基本函数(1)

方法声明用途参数结果及指针释放其他 
1. evhttp_new struct evhttp *evhttp_new(struct event_base *base)用于创建一个新的HTTP serverbase(可选)用来接收http事件在需要释放http server指针时,可参见函数evhttp_free()  
2. evhttp_bind_socketint evhttp_bind_socket(struct evhttp *http, const char *address, ev_uint16_t port)绑定http server到一个指定的ip地址和端口,可重复调用该函数来绑定到同一个地址的不同端口(1)http为待绑定的http server指针(2)address为待绑定的ip地址(3)port为待绑定的端口号0表示绑定成功,-1表示绑定失败跟此函数类似的一个函数为evhttp_bind_socket_with_handle,其声明是struct evhttp_bound_socket *evhttp_bind_socket_with_handle(struct evhttp *http, const char *address, ev_uint16_t port); 与evhttp_bind_socket唯一不同的地方是返回值不同,它返回了一个socket句柄 
3. evhttp_accept_socketint evhttp_accept_socket(struct evhttp *http, evutil_socket_t fd)使http server可以接受来自指定的socket的连接,可重复调用来绑定到不同的socket(1)http为待绑定的http server指针(2)fd为待绑定的socket(该socket应已准备好接受连接)0表示成功,-1表示失败跟此函数类似的一个函数为evhttp_accept_socket_with_handle,其声明是struct evhttp_bound_socket *evhttp_accept_socket_with_handle(struct evhttp *http, evutil_socket_t fd); 与evhttp_accept_socket唯一不同的地方是返回值不同,它返回了一个socket句柄 
4. evhttp_uri_parsestruct evhttp_uri *evhttp_uri_parse(const char *source_uri)一般必定调用evhttp_uri_parse_with_flags,从而解析uri中的host(即ip地址或者域名)和portsource_uri为指向uri的字符指针evhttp_uri_freeuri指统一资源标识符,是一个抽象概念,而url是一个具体的概念,可以根据url找到网上资源。具体可参考:https://www.zhihu.com/question/21950864 
5. evhttp_connection_base_newstruct evhttp_connection *evhttp_connection_base_new(
struct event_base *base, struct evdns_base *dnsbase,
const char *address, unsigned short port)
用于创建http请求的连接对象,即当连接对象con_obj得到了一个http request时,会主动解析address,并与之建立连接(1)base,用于处理连接事件,(2)dnsbase,用于解析host names,一般为NULL值,(3)address,需要建立连接的对端ip地址,(4)port,需要建立连接的对端端口号evhttp_connection_free  
6. evhttp_set_timeoutvoid evhttp_set_timeout(struct evhttp *http, int timeout_in_secs)为一个http请求设置超时时间(1)http,http server指针,(2)timeout_in_secs,以秒为单位   
7. evhttp_request_newstruct evhttp_request *evhttp_request_new(void (*cb)(struct evhttp_request *, void *), void *arg)用于创建一个http请求,该请求的内容未初始化,创建完后需立即填充(参考evhttp_add_header)(1)cb,为回调函数,当http 请求完成后(发送到对端成功,或者出现错误)被调用,(2)arg为任意需要在cb中使用的参数evhttp_request_free  
8. evhttp_add_headerint evhttp_add_header(struct evkeyvalq *headers, const char *key, const char *)为已存在的http请求头部添加另外的头部(1)headers,为http请求的output_headers,(2)key,为headers的名字,(3)value,为headers的值0表示成功,-1表示失败  
9. evhttp_make_requestint evhttp_make_request(struct evhttp_connection *evcon,   struct evhttp_request *req,    enum evhttp_cmd_type type, const char *uri)为指定的一个连接创建一个http请求,这个连接属于该http请求对象req,连接失败时,req不再有效,该指针已经被释放了(1)evcon, http连接,(2)req,已经创建好并已配置好的http请求,(3)type,该http请求的类型,EVHTTP_REQ_GET、EVHTTP_REQ_POST等0表示成功,-1表示失败需要取消http请求,可参考evhttp_cancel_request 

另附基于libevent的http client简单版本:

#include <event2/event_struct.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/http.h>
#include "evhttp.h"

int init_win_socket()
{
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		return -1;
	}
	return 0;
}

//http请求回调函数,用于处理服务器端的返回消息
void http_request_done(struct evhttp_request *req, void *arg)
{
	printf("send request ok...\n");
	size_t len = evbuffer_get_length(req->input_buffer);
	unsigned char * str = evbuffer_pullup(req->input_buffer, len);
	char buf[256] = { 0 };
	memcpy(buf, str, len);
	if (str == NULL)
	{
		printf("len = %d, str == NULL\n", len);
	}
	else
	{
		printf("len = %d, str = %s\n", len, buf);
	}

	event_base_loopbreak((struct event_base*)arg);
}

int main()
{
	struct event_base* base;
	struct evhttp_connection* conn;
	struct evhttp_request* req;
#ifdef WIN32
	init_win_socket();
#endif

	base = event_base_new();
	//conn = evhttp_connection_new(base, NULL, "192.168.1.109", 8081);
	conn = evhttp_connection_new("127.0.0.1", 8081); //建立与服务端的链接
	evhttp_connection_set_base(conn, base); //链接托管到新建的base上


	req = evhttp_request_new(http_request_done, base);  //创建http请求对象
	evhttp_add_header(req->output_headers, "Host", "localhost");  //填充http请求头内容
	evhttp_make_request(conn, req, EVHTTP_REQ_GET, "/test");  //发送http请求
	evhttp_connection_set_timeout(req->evcon, 600);  //设置超时时间,超过这个时间还没收到服务端消息,则自动回调本地回调函数http_request_done

	event_base_dispatch(base);  //死循环,等待服务端响应
	evhttp_connection_free(conn);
	event_base_free(base);
	printf("run over...\n");

	system("pause");
	return 0;
}

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Libevent是一个事件驱动的网络编程框架,而event.h是其核心头文件之一。该头文件定义了事件处理相关的结构体、函数和宏等内容。 下面是event.h中常用的一些定义和函数: ### 1.事件回调函数 ```c typedef void (*event_callback_fn)(evutil_socket_t fd, short events, void *arg); ``` 该类型定义了事件回调函数的原型,其中fd是事件所在的文件描述符,events是事件类型,arg是用户传入的参数。 ### 2.事件结构体 ```c struct event { event_callback_fn ev_callback; // 事件回调函数 int ev_fd; // 事件所在的文件描述符 short ev_events; // 事件类型 short ev_res; // 事件结果 struct event_base *ev_base; // 事件所属的event_base void *ev_arg; // 用户传入的参数 }; ``` 该结构体表示一个事件,其中ev_callback是事件回调函数,ev_fd是事件所在的文件描述符,ev_events是事件类型,ev_res是事件结果,ev_base是事件所属的event_base,ev_arg是用户传入的参数。 ### 3.事件类型 ```c #define EV_TIMEOUT 0x01 #define EV_READ 0x02 #define EV_WRITE 0x04 #define EV_SIGNAL 0x08 #define EV_PERSIST 0x10 #define EV_ET 0x20 ``` 该宏定义了事件类型,分别为超时事件、读事件、写事件、信号事件、持续事件和边缘触发事件。 ### 4.事件处理函数 ```c struct event_base *event_base_new(void); int event_base_dispatch(struct event_base *base); int event_base_loopexit(struct event_base *base, const struct timeval *tv); void event_base_free(struct event_base *base); ``` 这些函数用于创建event_base、处理事件、退出事件循环和释放event_base等操作。 以上是event.h中的一些常用内容,更多细节可以查看源码和官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值