下面这段代码是一个回射服务器,它会把客户端发送给它的信息再返回给客户端。
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/epoll.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <iostream>
typedef std::vector<struct epoll_event> EventList;
#define ERR_EXIT(n) do{perror(n);exit(EXIT_FAILURE);}while(0)
int main(void){
signal(SIGPIPE,SIG_IGN);
signal(SIGCHLD,SIG_IGN);
int idlefd=open("/dev/null",O_RDONLY | O_CLOEXEC);
int listenfd;
if((listenfd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
ERR_EXIT("socket");
struct sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(5188);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int on=1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)
ERR_EXIT("setsockopt");
if(listen(listenfd,SOMAXCONN)<0)
ERR_EXIT("listen");
std::vector<int> clients;
int epollfd;
epollfd=epoll_create1(EPOLL_CLOEXEC);
struct epoll_event event;
event.data.fd=listenfd;
event.events=EPOLIN;
epoll_ctl(epollfd,EPOLL_CTL_ADD,listenfd,&event);
EventList events(16);
struct sockaddr_in peeraddr;
socklen_t peerlen;
int connfd;
int nready;
while(1){
nready=epoll_wait(epollfd,&*events.begin(),static_cast<int>(events.size()),-1);
if(nready==-1){
if(errno==EINTR)
continue;
ERR_EXIT("epoll_wait");
}
if(nready==0){//没有事件发生
continue;
}
if((size_t)nready==events.size())
events.resize(events.size()*2);
for(int i=0;i<nready;++i){
if(events[i].data.fd==listenfd){
peerlen=sizeof(peeraddr);
connfd=::accept(listenfd,(struct sockaddr*)&peeraddr,&a