#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;
}
libevent 客户端,简单整理
最新推荐文章于 2023-05-13 11:00:32 发布