#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <ctype.h> #include <stdarg.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <signal.h> #include <sys/types.h> #include <dlfcn.h> #include <sstream> #include <sys/socket.h> #include <termios.h> #include <sys/stat.h> #include <sys/wait.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netdb.h> #include <dirent.h> #include <sys/time.h> #include <pthread.h> #include <semaphore.h> #include <stdexcept> #include <queue> #include <string> #include <sys/ipc.h> #include <net/if.h> #include <sys/msg.h> #include <sys/shm.h> #include <sys/sem.h> #include <sys/resource.h> #include <sys/ioctl.h> #include <utility> #include <map> #include <sys/epoll.h> #include <fstream> #include <linux/futex.h> #include <queue> #include <sstream> #include <time.h> #include <sys/times.h> //#include "GetTime.hpp" #include <pwd.h> #include <grp.h> #include <stropts.h> #include <poll.h> #include <netinet/tcp.h> using namespace std; #define MAX_LISTEN 65535 void setnoblocking(int32_t c_fd){ int32_t opts; opts=fcntl(c_fd,F_GETFL); if(opts<0){exit(1);} opts=opts|O_NONBLOCK; if(fcntl(c_fd,F_SETFL,opts)<0){ cout<<"set SETFL <0"<<endl; exit(1); } } int main(int argc,char* argv[]){ struct epoll_event ev,events[MAX_LISTEN]; int epfd=0,serverfd=0; int portnumber=atoi(argv[1]); const char* server="127.0.0.1"; //创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大 epfd=epoll_create(MAX_LISTEN); serverfd=socket(AF_INET,SOCK_STREAM,0); if(serverfd<0){ cout<<"serverfd:"<<strerror(errno)<<endl; exit(1); } setnoblocking(serverfd); //init sockaddr_in struct sockaddr_in server_sockaddr_in; bzero(&server_sockaddr_in,sizeof(server_sockaddr_in)); server_sockaddr_in.sin_family=AF_INET; server_sockaddr_in.sin_port=htons(portnumber); server_sockaddr_in.sin_addr.s_addr=inet_addr(server); bind(serverfd,(struct sockaddr*)&server_sockaddr_in,sizeof(server_sockaddr_in)); listen(serverfd,MAX_LISTEN); ev.data.fd=serverfd; ev.events=EPOLLIN|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_ADD,serverfd,&ev); char read_buf[4*1024]; while(1){ int nepfd=epoll_wait(epfd,events,MAX_LISTEN,-1); for(int i=0;i<nepfd;i++){ if(events[i].data.fd==serverfd){ struct sockaddr_in their_addr; socklen_t slen=sizeof(server_sockaddr_in); int connfd=0; connfd=accept(serverfd,(struct sockaddr*)&their_addr,&slen); if(connfd<0){ cout<<"error:connfd<0"<<connfd<<" "<<strerror(errno)<<endl; continue; } char* client_ip=inet_ntoa(their_addr.sin_addr); cout<<"client_ip:"<<client_ip<<endl; ev.data.fd=connfd; ev.events=EPOLLIN|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev); }else if(events[i].events&EPOLLIN){ int c_fd=events[i].data.fd; if(c_fd<0){ cout <<"c_fd:error:"<<c_fd<<endl; continue; } int read_b=0; memset(read_buf,'\0',sizeof(read_buf)); read_b=recv(c_fd,read_buf,sizeof(read_buf),0); if(read_b=0){ cout<<"peer colse"<<endl; close(c_fd); events[i].data.fd=-1; }else if(read_b<0){ int k_er=errno; if(k_er == EAGAIN || k_er == EWOULDBLOCK || k_er == EINTR){ cout <<"error recv read_b <0"<<endl; continue; }else{ std::cout<<"readline error"<<std::endl; } }else{ cout<<"have messge recv:"<<events[i].data.fd<<endl; cout<<"have messge recv:"<<read_buf<<endl; ev.data.fd=c_fd; ev.events=EPOLLOUT|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_MOD,c_fd,&ev); memset(read_buf,'\0',sizeof(read_buf)); } memset(read_buf,'\0',sizeof(read_buf)); } else if(events[i].events&EPOLLOUT){ int c_recv_fd=events[i].data.fd; string szTemp("reply"); szTemp = "Server:" + szTemp + "\n\r"; send(c_recv_fd, szTemp.c_str(), szTemp.size(), 0); ev.data.fd=c_recv_fd; ev.events=EPOLLIN|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_MOD,c_recv_fd,&ev); } } } close(epfd); return 0; }