libevent-学习01-实现TCPSERVER-水平触发-监听连接并获取连接

代码图片为了好看、最后有可复制代码。。。

~~代码图片~~

#include <iostream>
#include <event2/event.h>

#ifdef _WIN32
#include <signal.h>
#endif // _WIN32
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
	//初始化socket库
	WSADATA WSD;
	WSAStartup(MAKEWORD(2,2),&WSD);
#else
	//使用断开连接的socket,会发出此信号,造成程序退出
	if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) 
	{
		return 1;
	}
#endif
	std::cout<<"test libevent first"<<std::endl;
	//创建libevent的上下文 默认是创建base锁
	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;
	}
	//2、创建socket 绑定端口
	evutil_socket_t sock = socket(AF_INET,SOCK_STREAM,0);
	if (sock <= 0) 
	{
		//_CRT_SECURE_NO_WARNINGS
		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)
	{
		//_CRT_SECURE_NO_WARNINGS
		std::cerr << "bind port:" << serverport <<"error:"<< strerror(errno) << std::endl;
		return -1;
	}
	listen(sock, 10);
	std::cout << "bind port success !!"<< serverport << std::endl;
	//3注册socket 的监听回调函数 EV_PERSIST 持久化、不然值执行一次事件、
	// EV_ET  开启边缘触发 默认水平出发(只要有数据没处理,就一直触发)
	// event_self_cbarg() 传递当前创建的event对象
	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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值