⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcps-epoll.cpp

📁 Linux Epoll用法实例(Socket编程)
💻 CPP
字号:
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <arpa/inet.h>#include <sys/epoll.h>#define SERVPORT 9999#define BACKLOG 10#define MAXDATASIZE 100#define MAX_EPOLL_NUM 200char *strrev(char *str) {    char *p1, *p2;    if (!str || !*str)          return str;    for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)    {      *p1 ^= *p2;      *p2 ^= *p1;      *p1 ^= *p2;    }    return str; }int main(int argc, char *argv[]){   int sockFd, connectedFd;   struct sockaddr_in serv_addr;   struct sockaddr_in client_addr;   int epollFd, ackFds;   struct epoll_event eventReg, epollEvent[MAX_EPOLL_NUM];   char buf[MAXDATASIZE];   int recvBytes;         printf("create the socket...\n");   if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) == -1)    {     perror("create socket error!");      exit(1);   }      serv_addr.sin_family=AF_INET;   serv_addr.sin_port=htons(SERVPORT);   serv_addr.sin_addr.s_addr = INADDR_ANY;   bzero(&(serv_addr.sin_zero),0);         int yes = 1;   if (setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)   {     perror("setsockopt error!");     close(sockFd);     exit(1);   }       printf("bind the socket...\n");   if (bind(sockFd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)    {     perror("bind error!");     close(sockFd);     exit(1);   }   printf("socket is listening...\n");      if (listen(sockFd, BACKLOG) == -1)    {     perror("listen error!");     close(sockFd);     exit(1);   }   epollFd = epoll_create(MAX_EPOLL_NUM);   eventReg.data.fd = sockFd;   eventReg.events = EPOLLIN;   if(epoll_ctl(epollFd, EPOLL_CTL_ADD, sockFd, &eventReg) < 0)   {     perror("epoll_ctl error!");     close(sockFd);     exit(1);   }   while(1)   {     printf("epollwaitting...\n");     ackFds = epoll_wait(epollFd, epollEvent, MAX_EPOLL_NUM, -1);               for(int i=0; i<ackFds; i++)     {       if (epollEvent[i].data.fd == sockFd)       {       	 printf("socket is ready for accept...accepting...\n");	 socklen_t add_size = sizeof(struct sockaddr_in);	 if ((connectedFd = accept(epollEvent[i].data.fd, (struct sockaddr *)&client_addr, &add_size)) == -1) 	 {	   perror("accept error!");	   close(epollEvent[i].data.fd);	   exit(1);	 }         else	 {           printf("received a connection from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));	   if (send(connectedFd, "Hello, you are connected!\n", 26, 0) == -1)	   {	     perror("send error!");	     close(connectedFd);	     continue;	   }	   eventReg.data.fd = connectedFd;	   eventReg.events = EPOLLIN;	   if(epoll_ctl(epollFd, EPOLL_CTL_ADD, connectedFd, &eventReg) < 0)	   {	     perror("1epoll_ctl error!");	     close(connectedFd);	     continue;	   }	 }       }       else       {	 recvBytes=-1;	 if ((recvBytes=recv(epollEvent[i].data.fd, buf, MAXDATASIZE, 0)) ==-1) 	 {	   perror("recv error!");	   eventReg.data.fd = epollEvent[i].data.fd;	   if(epoll_ctl(epollFd, EPOLL_CTL_DEL, epollEvent[i].data.fd, &eventReg) < 0)	   {	     perror("epoll_ctl error!");	   }	   close(epollEvent[i].data.fd);	   continue;	 }	 buf[recvBytes] = '\0';	 printf("Received: %s\n",buf);	 strcpy(buf, strrev(buf));	 if (send(epollEvent[i].data.fd, buf, strlen(buf), 0) == -1)	 {	   perror("send error!");	   eventReg.data.fd = epollEvent[i].data.fd;	   if(epoll_ctl(epollFd, EPOLL_CTL_DEL, epollEvent[i].data.fd, &eventReg) < 0)	   {	     perror("epoll_ctl error!");	   }	   close(epollEvent[i].data.fd);	   continue;	 }         if (buf[0] == '0')	 {           printf("one client exited!\n");	   eventReg.data.fd = epollEvent[i].data.fd;	   if(epoll_ctl(epollFd, EPOLL_CTL_DEL, epollEvent[i].data.fd, &eventReg) < 0)	   {	     perror("epoll_ctl error!");	   }	   close(epollEvent[i].data.fd);	   continue;	 }       }     }   }     close(sockFd);     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -