利用epoll实现的服务器
/*************************************************************************
> File Name: tcp_server.c
> Author: yas
> Mail: rage_yas@hotmail.com
> Created Time: Tue 27 Aug 2024 06:21:01 PM CST
************************************************************************/
#include<stdio.h>
#include "head.h"
int init_tcp_ser(const char *ip ,unsigned short port)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd)
{
perror("fail socket");
return -1;
}
struct sockaddr_in ser;
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
int ret = bind(sockfd, (struct sockaddr *)&ser, sizeof(ser));
if (-1 == ret)
{
perror("fail bind");
return -1;
}
ret = listen(sockfd, 128);
if (-1 == ret)
{
perror("fail listen");
return -1;
}
return sockfd;
}
int epoll_add_fd(int epfds, int fd, uint32_t event)
{
struct epoll_event ev;
ev.events = event;
ev.data.fd = fd;
int ret = epoll_ctl(epfds, EPOLL_CTL_ADD, fd, &ev);
if(ret == -1)
{
perror("fail epoll_ctl");
return -1;
}
return 0;
}
int epoll_del_fd(int epfds, int fd)
{
int ret = epoll_ctl(epfds, EPOLL_CTL_DEL, fd, NULL);
if(-1 == ret)
{
perror("fail epoll_del_fd");
return -1;
}
return 0;
}
int main(int argc, const char *argv[])
{
char buf[1024] = { 0 };
int connfd[128] = { 0 };
int sockfd = init_tcp_ser("192.168.1.133", 50000);
if (-1 == sockfd)
{
return -1;
}
struct epoll_event evs[128];
int epfds = epoll_create(128);
if(-1 == epfds)
{
perror("fail epoll_create");
return -1;
}
int i = 0;
epoll_add_fd(epfds, sockfd, EPOLLIN);
while(1)
{
if(i >= 128)
{
break;
}
int cnt = epoll_wait(epfds, evs, 128, -1);
if(cnt < 0)
{
perror("fail epoll_wait");
return -1;
}
for(int j = 0; j < cnt; ++j)
{
if(sockfd == evs[j].data.fd)
{
connfd[i] = accept(sockfd, NULL, NULL);
if(connfd[i] == -1)
{
perror("fail accept");
break;
}
epoll_add_fd(epfds, connfd[i], EPOLLIN);
++i;
}
for(int k = 0; k <= i; ++k)
{
if(connfd[k] == evs[j].data.fd)
{
memset(buf,0,sizeof(buf));
size_t size = recv(connfd[j], buf, sizeof(buf), 0);
if(size < 0)
{
perror("fail recv");
epoll_del_fd(epfds, evs[j].data.fd);
close(evs[j].data.fd);
continue;
}
else if(size == 0)
{
epoll_del_fd(epfds, evs[j].data.fd);
close(evs[j].data.fd);
continue;
}
printf("buf = %s\n", buf);
strcat(buf, "ok");
size = send(connfd[k],buf, strlen(buf), 0);
if(size < 0)
{
perror("fail send");
epoll_del_fd(epfds, evs[j].data.fd);
close(evs[j].data.fd);
continue;
}
}
}
}
}
return 0;
}