libevent之bufferevent中获取客户端ip

libevent之bufferevent中获取客户端ip
最近在使用libevent中的bufferevent实现TCP通信的时候,需要用到获取客户端ip的操作
然而感觉网上代码中几乎都避开了获取ip的功能,让我差点以为没办法获取,最后查阅后发现在监听连接的回调函数中的参数里有一个是包含客户端IP的。即:

static void
listener_cb(struct evconnlistener* listener, evutil_socket_t fd,
	struct sockaddr* sa, int socklen, void* user_data)

这个回调函数中的struct sockaddr *sa中就保存着需要的客户端地址。此时问题又来了,sockaddr如果要读出ip我们需要把他变成sockaddr_in类型,关于为什么可以自行查,网上很多解释的,下面是转换方法

    char* ip=new char;
	sockaddr_in sin;
	memcpy(&sin, sa, sizeof(sin));
	sprintf(ip, inet_ntoa(sin.sin_addr));

这步操作就可以把ip提取出到char *ip里了。这里有一个点,为什么要new。因为我不在listener这个回调函数里用这个变量,我要把ip当参数传递到read的回调函数里(个人需求)。如果不new会导致listener结束ip被释放
接下来再顺便说一下关于把ip传递到read回调函数(write,event回调函数同理)。可以看到,最后void*是回调函数传递参数,如果不传递可以写NULL,我需要在read中用ip所以就传进去ip

void bufferevent_setcb(struct bufferevent *bufev,
    bufferevent_data_cb readcb, bufferevent_data_cb writecb,
    bufferevent_event_cb eventcb, void *cbarg)
bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb,ip);

最后在read里取出来用就好了

static void
conn_readcb(struct bufferevent* bev, void* user_data)
{
	char* ip = (char*)user_data;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
libeventbufferevent 可以用于收发数据,具体步骤如下: 1. 创建 bufferevent 对象: ``` struct bufferevent *bev; bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); ``` 其,base 是 event_base 对象,fd 是已连接的 socket 文件描述符,BEV_OPT_CLOSE_ON_FREE 表示在释放 bufferevent 对象时关闭底层的 socket 连接。 2. 设置回调函数: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { // 处理读事件 } void bev_write_cb(struct bufferevent *bev, void *ctx) { // 处理写事件 } void bev_event_cb(struct bufferevent *bev, short events, void *ctx) { // 处理事件 } bufferevent_setcb(bev, bev_read_cb, bev_write_cb, bev_event_cb, NULL); ``` bufferevent_setcb 函数用于设置 bufferevent 对象的回调函数,包括读、写、事件回调函数。 3. 启用 bufferevent: ``` bufferevent_enable(bev, EV_READ|EV_WRITE); ``` bufferevent_enable 函数用于启用 bufferevent 对象的读写事件。 4. 发送数据: ``` const char *data = "hello, world"; bufferevent_write(bev, data, strlen(data)); ``` bufferevent_write 函数用于向 bufferevent 对象写入数据。 5. 接收数据: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { char buf[1024]; size_t len = bufferevent_read(bev, buf, sizeof(buf)); // 处理接收到的数据 } ``` bev_read_cb 回调函数,使用 bufferevent_read 函数从 bufferevent 对象读取数据。 以上就是 libeventbufferevent 收发数据的基本步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值