epoll+边缘触发linux服务器
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
int main(int argc, const char* argv[])
{
int svr_fd = socket(AF_INET, SOCK_STREAM, 0);
if (svr_fd < 0)
{
perror("socket");
return EXIT_FAILURE;
}
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(8887);
addr.sin_addr.s_addr = inet_addr("192.168.110.4");
socklen_t addrlen = sizeof(addr);
if (bind(svr_fd, (struct sockaddr*)&addr, addrlen))
{
perror("bind");
return EXIT_FAILURE;
}
if (listen(svr_fd, 10))
{
perror("listen");
return EXIT_FAILURE;
}
int epfd = epoll_create(10);
if (epfd < 0)
{
perror("epoll_create");
return EXIT_FAILURE;
}
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = svr_fd;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, svr_fd, &event))
{
perror("epoll_ctl");
return EXIT_FAILURE;
}
struct epoll_event events[10] = {};
char buf[4] = {};
size_t buf_size = sizeof(buf);
for (;;)
{
int event_cnt = epoll_wait(epfd, events, 10, 10000);
if (event_cnt == 0) continue;
if (event_cnt < 0)
{
perror("epoll_wait");
continue;
}
printf("epoll_wait 有事件触发\n");
for (int i = 0; i < event_cnt; i++)
{
if (svr_fd == events[i].data.fd)
{
int cli_fd = accept(svr_fd, (struct sockaddr*)&addr, &addrlen);
if (cli_fd > 0)
{
event.events = EPOLLIN | EPOLLET;
event.data.fd = cli_fd;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, cli_fd, &event))
{
perror("epoll_ctl");
close(cli_fd);
continue;
}
}
}
else
{
int ret = 0;
char temp[1024] = {};
while ((ret = recv(events[i].data.fd, buf, buf_size, MSG_DONTWAIT)) > 0)
{
buf[ret] = '\0';
strcat(temp, buf);
}
if(0==strcmp(temp,"quit"))
{
printf("客户端%d退出\n", events[i].data.fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
continue;
}
printf("recv: %s bits: %lu\n", temp,strlen(temp)+1);
strcat(temp,":return");
ret = send(events[i].data.fd, temp, strlen(temp), 0);
if (ret <= 0)
{
printf("客户端%d退出\n", events[i].data.fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
continue;
}
}
}
}
return 0;
}