#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <linux/tcp.h>
#define MAX_CLIENT 1000
#define MAXEPOLLSIZE 5+MAX_CLIENT+1
#define AMS_PORT 7338
#define MAX_SOCK_SIZE 1024*10
#define BACKLOG 10
int setnonblocking(int sockfd)
{
if(fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFD,0)|O_NONBLOCK)==-1)
{
return -1;
}
return 0;
}
int handle_message(int new_fd)
{
return 0;
}
int main()
{
int iListenFd, iClientFd, iEpollFd, iEventOccur, n, ret, iCurrentFds;
int iFlag = 1;
int iSockBuffSize;
socklen_t len;
struct sockaddr_in tServerAddr, tClientAddr;
struct epoll_event tTempEvent;
struct epoll_event tEvents[MAXEPOLLSIZE];
struct rlimit rt;
rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
if(setrlimit(RLIMIT_NOFILE,&rt)==-1)
{
perror("setrlimit");
exit(1);
}
if((iListenFd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
ret=setsockopt(iListenFd,IPPROTO_TCP,TCP_NODELAY,(char*)&iFlag,sizeof(iFlag));
if(ret == -1)
{
printf("Couldn't setsockopt(TCP_NODELAY)\n");
exit(-1);
}
setnonblocking(iListenFd);
bzero(&tServerAddr,sizeof(tServerAddr));
tServerAddr.sin_family = AF_INET;
tServerAddr.sin_port = htons(AMS_PORT);
tServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(tServerAddr.sin_zero),8);
if(bind(iListenFd,(struct sockaddr*)&tServerAddr,sizeof(struct sockaddr))<0)
{
perror("bind");
exit(1);
}
if(listen(iListenFd,BACKLOG)<0)
{
perror("listen");
exit(1);
}
iEpollFd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
tTempEvent.events = EPOLLIN | EPOLLET;
tTempEvent.data.fd = iListenFd;
if(epoll_ctl(iEpollFd,EPOLL_CTL_ADD,iListenFd,&tTempEvent)<0)
{
fprintf(stderr,"epoll set insertion error:fd=%d\n",iListenFd);
return -1;
}
iCurrentFds = 1;
while(1)
{
iEventOccur = epoll_wait(iEpollFd, tEvents, iCurrentFds, -1);
if(iEventOccur<0)
{
perror("epoll_wait");
break;
}
else
{
printf("Event occur:%d\r\n",iEventOccur);
}
for(n=0; n<iEventOccur; ++n)
{
if(tEvents[n].data.fd == iListenFd)
{
iClientFd = accept(iListenFd,(struct sockaddr*)&tClientAddr,&len);
if(iCurrentFds == MAX_CLIENT + 1)
{
close(iClientFd);
continue;
}
if(iClientFd<0)
{
printf("system error:%d",errno);
perror("accept");
continue;
}
else
{
printf("Client connect from:%d:%d,socketfd:%d\n",inet_ntoa
(tClientAddr.sin_addr),ntohs(tClientAddr.sin_port),iClientFd);
}
setnonblocking(iClientFd);
tTempEvent.events = EPOLLIN | EPOLLET;
tTempEvent.data.fd = iClientFd;
if(epoll_ctl(iEpollFd,EPOLL_CTL_ADD,iClientFd,&tTempEvent)<0)
{
fprintf(stderr,"add epoll event failed:'%d',%s\n",iClientFd,strerror
(errno));
return -1;
}
iCurrentFds++;
}
else
{
ret = handle_message(tEvents[n].data.fd);
if(ret<1 && errno != 11)
{
epoll_ctl(iEpollFd,EPOLL_CTL_DEL,tEvents[n].data.fd,&tTempEvent);
iCurrentFds--;
}
}
}
}
close(iListenFd);
return 0;
}