代码图片为了好看、最后有可复制代码。。。
#include <iostream>
#include <event2/event.h>
#ifdef _WIN32
#include <signal.h>
#endif
typedef void(*event_callback_fn)(evutil_socket_t, short, void *);
void listen_callback(evutil_socket_t sock, short what, void *arg)
{
std::cout << "listen_callback"<<std::endl;
if (!(what &EV_READ))
{
std::cout << "listen_callback" << std::endl;
return;
}
sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
socklen_t size = sizeof(sin);
evutil_socket_t client_socket = accept(sock,(sockaddr*)&sin,&size);
if (client_socket<=0 )
{
std::cerr << "accept error"<< std::endl;
return;
}
char ip[16] = { 0 };
evutil_inet_ntop(AF_INET,&sin.sin_addr,ip,sizeof(ip));
std::cout << "client ip is:"<< ip << std::endl;
}
int main(int argc,char**argv)
{
int serverport = 20001;
if (argc >1)
{
serverport = atoi(*argv);
}
#ifdef _WIN32
WSADATA WSD;
WSAStartup(MAKEWORD(2,2),&WSD);
#else
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
{
return 1;
}
#endif
std::cout<<"test libevent first"<<std::endl;
event_base * eventbase = event_base_new();
if (eventbase)
{
std::cout << "event_base_new success" << std::endl;
}
else
{
std::cout << "event_base_new fail !!" << std::endl;
}
evutil_socket_t sock = socket(AF_INET,SOCK_STREAM,0);
if (sock <= 0)
{
std::cerr << "socket error" << strerror(errno) << std::endl;
return -1;
}
evutil_make_socket_nonblocking(sock);
evutil_make_listen_socket_reuseable(sock);
sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(serverport);
int ret = ::bind(sock,(sockaddr*)&sin,sizeof(sin));
if (ret != 0)
{
std::cerr << "bind port:" << serverport <<"error:"<< strerror(errno) << std::endl;
return -1;
}
listen(sock, 10);
std::cout << "bind port success !!"<< serverport << std::endl;
event *ev = event_new(eventbase,sock,EV_READ | EV_PERSIST, listen_callback,event_self_cbarg());
event_add(ev, 0);
event_base_dispatch(eventbase);
evutil_closesocket(sock);
event_del(ev);
event_free(ev);
event_base_free(eventbase);
return 0;
}