libevent 客户端,简单整理

#include <event2/dns.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/util.h>
#include <event2/event.h>

#include <stdio.h>
#include <iostream>

const unsigned short PORT = 9995;

void readcb(struct bufferevent *bev, void *ptr)
{
	char buf[1024];
	int n;
	struct evbuffer *input = bufferevent_get_input(bev);
	while ((n = evbuffer_remove(input, buf, sizeof(buf))) > 0)
	{
		fwrite(buf, 1, n, stdout);
	}
}

void writecb(struct bufferevent *bev, void *ptr)
{
	std::cout << "回调函数:writecb" << std::endl;
}

void eventcb(struct bufferevent *bev, short events, void *ptr)
{
	if (events & BEV_EVENT_CONNECTED)
		printf("Connect okay.\n");
	else if (events & (BEV_EVENT_ERROR | BEV_EVENT_EOF))
	{
		struct event_base *base = (struct event_base *)ptr;
		if (events & BEV_EVENT_ERROR)
		{
			int err = bufferevent_socket_get_dns_error(bev);
			if (err)
				printf("DNS error: %s\n", evutil_gai_strerror(err));
		}
		printf("Closing\n");
		bufferevent_free(bev);
		event_base_loopexit(base, NULL);
	}
}

int main(int argc, char *argv[])
{
#ifdef WIN32
	WSADATA wsa_data;
	WSAStartup(0x0201, &wsa_data);
#endif

	struct event_base *base;
	struct evdns_base *dns_base;
	struct bufferevent *bev;

	base = event_base_new();
	dns_base = evdns_base_new(base, 1);

	bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);

	bufferevent_setcb(bev, readcb, writecb, eventcb, base);
	bufferevent_enable(bev, EV_READ | EV_WRITE);

	bufferevent_socket_connect_hostname(
		bev, dns_base, AF_UNSPEC, "127.0.0.1", PORT);

	// 往服务器写数据
	struct evbuffer* output = bufferevent_get_output(bev);
	// 将"data" 4个字节添加到evb 中。成功返回0, 失败返回-1。
	int res = 0;
	res = evbuffer_add(output, "data", strlen("data") + 1);
	std::cout << "res = " << res << std::endl;

	// 开始事件循环
	event_base_dispatch(base);

	event_base_free(base );

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值