0
点赞
收藏
分享

微信扫一扫

epoll简单回声服务器

A邱凌 2022-05-16 阅读 49

条件触发

void server102()
{
int serv_sock, clnt_sock;
sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_sz ;
char buf[1024]{};
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
serv_adr.sin_family = AF_INET;
serv_adr.sin_port = htons(9527);
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
int optval = 0;
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(sockaddr_in));
if (bind(serv_sock, (sockaddr*)&serv_adr, sizeof(sockaddr)) == -1) {
printf("bind error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
if (listen(serv_sock, 5) == -1) {
printf("listen error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
epoll_event event;
int epfd, event_cnt;
epfd = epoll_create(2048);
if (epfd == -1) {
printf("epoll_create error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
epoll_event* all_events = new epoll_event[100];

event.events = EPOLLIN;
event.data.fd = serv_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);
while (true) {
event_cnt = epoll_wait(epfd, all_events, 100, 1000);//all_events用来接收消息队列
if (event_cnt == -1) {
printf("epoll_wait error %d %s\n", errno, strerror(errno));
break;
}
if (event_cnt == 0)continue;
;
for (int i = 0; i < event_cnt; i++) {
if (all_events[i].data.fd == serv_sock) {
clnt_sz = sizeof(clnt_adr);
clnt_sock = accept(serv_sock, (sockaddr*)&clnt_adr, &clnt_sz);
event.events = EPOLLIN;
event.data.fd = clnt_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
printf("client is connected!%d\n", clnt_sock);
}
else {
ssize_t len = read(all_events[i].data.fd, buf, sizeof(buf));
if (len <= 0) {
epoll_ctl(epfd, EPOLL_CTL_DEL, all_events[i].data.fd, &all_events[i]);
close(all_events[i].data.fd);
printf("client is exeit!%d\n", clnt_sock);
}
else {
write(all_events[i].data.fd, buf, len);
}
}
}
}
delete[] all_events;
close(serv_sock);
close(epfd);
}

边缘触发

void server102()
{
int serv_sock, clnt_sock;
sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_sz ;
char buf[5]{};
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
serv_adr.sin_family = AF_INET;
serv_adr.sin_port = htons(9527);
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
int optval = 0;
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(sockaddr_in));
if (bind(serv_sock, (sockaddr*)&serv_adr, sizeof(sockaddr)) == -1) {
printf("bind error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
if (listen(serv_sock, 5) == -1) {
printf("listen error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
epoll_event event;
int epfd, event_cnt;
epfd = epoll_create(2048);
if (epfd == -1) {
printf("epoll_create error %d %s\n", errno, strerror(errno));
close(serv_sock);
return;
}
epoll_event* all_events = new epoll_event[100];
event.events = EPOLLIN;
event.data.fd = serv_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);
while (true) {
event_cnt = epoll_wait(epfd, all_events, 100, 1);//all_events用来接收消息队列
if (event_cnt == -1) {
printf("epoll_wait error %d %s\n", errno, strerror(errno));
break;
}
if (event_cnt == 0)continue;
;
for (int i = 0; i < event_cnt; i++) {
if (all_events[i].data.fd == serv_sock) {
clnt_sz = sizeof(clnt_adr);
clnt_sock = accept(serv_sock, (sockaddr*)&clnt_adr, &clnt_sz);
event.events = EPOLLIN|EPOLLET;//EPOLLET启动边缘触发
event.data.fd = clnt_sock;
int flag = fcntl(clnt_sock, F_GETFL, 0);//获取连接客户端的状态
fcntl(clnt_sock, F_SETFL, flag | O_NONBLOCK);//将连接客户端设置为非阻塞状态,适合于大文件多次收发
epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
printf("client is connected!%d\n", clnt_sock);
}
else {
while (true) {//循环读
ssize_t len = read(all_events[i].data.fd, buf, sizeof(buf));
if (len < 0) {
if (errno == EAGAIN)//表示已经读完了
break;
printf("epoll_wait error %d %s\n", errno, strerror(errno));
}
if (len == 0) {
epoll_ctl(epfd, EPOLL_CTL_DEL, all_events[i].data.fd, &all_events[i]);
close(all_events[i].data.fd);
printf("client is exeit!%d\n", clnt_sock);
break;
}
else {
printf("%s(%d):%s \n", __FILE__, __LINE__, __FUNCTION__);
write(all_events[i].data.fd, buf, len);
}
}
}
}
printf("%s(%d):%s \n", __FILE__, __LINE__, __FUNCTION__);
}
delete[] all_events;
close(serv_sock);
close(epfd);
}
举报

相关推荐

0 条评论