epoll实现并发服务器代码

select/poll/epoll区别?

#include "c.h"
#define ERR_MSG(msg) do{fprintf(stderr,"line:%d",__LINE__);perror(msg);}while(0)
#define IP "192.168.250.100"
#define PORT 6666
int deal_cli_msg(int newfd,struct sockaddr_in cin);//回收僵尸进程
void handler(int sig)
{while(waitpid(-1,NULL,WNOHANG)>0);
}int main(int argc,const char * argv[])
{//捕获17号 SIGCHLD信号,回收僵尸进程__sighandler_t s=signal(17,handler);if(SIG_ERR==s){ERR_MSG("signal");return -1;}//创建流式套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("sfd=%d\n",sfd);//允许端口快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用成功\n");//填充地址信息结构体struct sockaddr_in sin;sin.sin_family =AF_INET;sin.sin_port =htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);//将ip和端口绑定到套接字上if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");return -1;}printf("ip绑定套接字成功__%d__\n",__LINE__);//将套接字设置为可监听状态if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("将套接字设置为可监听状态成功__%d__\n",__LINE__);//存储连接成功的客户端地址信息struct sockaddr_in cin;socklen_t addrlen =sizeof(cin);int newfd=-1;//用epoll来接收和发送int epfd, i, fd, ret;struct epoll_event event;struct epoll_event revents[10];char buf[128] = {0};// 1.创建epollif ((epfd = epoll_create(10)) == -1)PRINT_ERR("epoll create error");for (i = 1; i < argc; i++){if ((fd = open(argv[i], O_RDWR)) == -1)PRINT_ERR("open file error");event.events = EPOLLIN;event.data.fd = fd;// 2.向epoll中添加想要监听的事件if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event))PRINT_ERR("epoll ctl error");}while (1){// 3.阻塞等待事件准备好ret = epoll_wait(epfd, revents, 10, -1);if (ret == -1){PRINT_ERR("epoll wait error");}for (i = 0; i < ret; i++){if (revents[i].events & EPOLLIN){read(revents[i].data.fd, buf, sizeof(buf));printf("fd = %d,buf = %s\n", revents[i].data.fd, buf);}}}//关闭进程的所有的文件描述符for(i=0;i<getdtablesize();i++){close(i);}return 0;return 0;
}

本文链接:https://my.lmcjl.com/post/1208.html

展开阅读全文

4 评论

留下您的评论.