📄 tcps-epoll.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 + -