#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/epoll.h>
//单线程水平模式epoll
int main(int argc, const char *argv[]){
int lfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_msg_st={AF_INET,htons(6666),inet_addr("192.168.250.100")};
int len=sizeof(server_msg_st),cfd=0,i=0,fd=0;
char buff[128]={0};
bind(lfd,(struct sockaddr*)&server_msg_st,len);
listen(lfd,5);
int epfd=epoll_create(100);
struct epoll_event ep_event={0};
ep_event.events=EPOLLIN;
ep_event.data.fd=lfd;
epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ep_event);//将监听套接字添加到epoll树上
struct epoll_event ep_events[1000]={0};//纪录信息的结构体
int size=sizeof(ep_events)/sizeof(ep_events[0]);
printf("服务器已开启\n");
while(1){
int num=epoll_wait(epfd,ep_events,size,-1);
for(i=0;i<num;i++){
if(lfd==(fd=ep_events[i].data.fd)){
int cfd=accept(lfd,NULL,NULL);
printf("连接成功\n");
ep_event.events=EPOLLIN;//前面的信息已被拷贝走,不用创建新的,直接覆盖
ep_event.data.fd=cfd;//从ctl写入,从wait的ep_events[i].data.fd读出
epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ep_event);//添加连接的fd
}else{
memset(buff,0,sizeof(buff));
if(0==recv(fd,buff,sizeof(buff),0)){
epoll_ctl(epfd,EPOLL_CTL_DEL,fd,NULL);//删除断开连接的fd
close(fd);
printf("fd=%d断开连接\n",fd);
break;
}
printf("%s\n",buff);
}
}
}
close(lfd);
return 0;
}
单线程epoll服务器
于 2023-10-28 18:53:28 首次发布