#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;
}

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
  • 2021-09-30
  • 2021-06-22
  • 2021-11-27
猜你喜欢
  • 2021-12-27
  • 2022-02-20
  • 2022-12-23
  • 2022-01-15
  • 2022-01-26
相关资源
相似解决方案