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;