int main()
{
signal(sigpipe, sig_ign);//ignore signal, don't shutdown service
struct epoll_event events[max_file], ev;
memset(events, '\0', sizeof(events));
memset(&ev, '\0', sizeof(ev));
int epollfd = 0;
epollfd = epoll_create(max_file);
if (epollfd < 0)
{
std::cout << "epoll_create errno"<< errno << std::endl;
}
int sockfd = 0;
sockfd = socket(af_inet, sock_stream, 0);
setsocknoblock(sockfd);
ev.data.fd = sockfd;
ev.events = epollin|epollerr|epollhup|epollet;
int epollerror = 0;
epollerror = epoll_ctl(epollfd, epoll_ctl_add, sockfd, &ev);
if (epollerror < 0)
{
std::cout << "epoll_ctl add sockfd errno " << errno<<std::endl;
}
int opt = so_reuseaddr;
setsockopt(sockfd, sol_socket, so_reuseaddr, &opt, sizeof(opt));
struct sockaddr_in serviceaddr;
memset(&serviceaddr, '\0', sizeof(serviceaddr));
serviceaddr.sin_family = af_inet;
serviceaddr.sin_port = htons(port);
if(inet_pton(af_inet,ip,&serviceaddr.sin_addr) <= 0)
{
std::cout <<"can not create a network address structure" << std::endl;
close(sockfd);
}
if (bind(sockfd, (struct sockaddr*)&serviceaddr, sizeof(serviceaddr))<0)
{
std::cout<<"can not bind a socket"<<std::endl;
close(sockfd);
}
if (listen(sockfd, 1024) < 0)
{
std::cout << "can not listen for connect" << std::endl;
close(sockfd);
}
char recvbuffer[8193];
memset(recvbuffer, '\0', 8193);
char sendbuffer[8193];
memset(sendbuffer, '\0', 8193);
int i = 0;
for( ; ; )
{
int epollfds = 0;
epollfds = epoll_wait(epollfd, events, max_file, -1);
for(i = 0; i < epollfds; ++i )
{
if (events.data.fd== sockfd)
{
struct sockaddr_in clientaddr;
memset(&clientaddr, '\0', sizeof(clientaddr));
int clientsockfd = 0;
socklen_t clientaddrlen = sizeof(clientaddr);
clientsockfd = accept(sockfd, (struct sockaddr*)&clientaddr, &clientaddrlen);
std::cout << "clientsockfd is : " << clientsockfd << std::endl;
std::cout << "client address is : " << inet_ntoa(clientaddr.sin_addr) << std::endl;
std::cout << "client port is : " << ntohs(clientaddr.sin_port)<< std::endl;
if (clientsockfd < 0)
{
std::cout << "accept error " << errno<<std::endl;
exit(1);
}
else
{
setsocknoblock(clientsockfd);
ev.data.fd = clientsockfd;
ev.events = epollin|epollerr|epollhup|epollet|epolloneshot;
int epollerror = 0;
epollerror = epoll_ctl(epollfd, epoll_ctl_add, clientsockfd, &ev);
if (epollerror < 0)
{
std::cout << "epoll_ctl add clientsockfd errno " << errno<<std::endl;
}
}
}
else
{
if (events.events & epollerr)
{
std:: cout << "epollerr "<< std::endl;
std:: cout << "errno "<< errno <<"fd is : " << events.data.fd<<std::endl;
delsockfrmepoll(events.data.fd, epollfd);
}
else if (events.events & epollhup)
{
std:: cout << "epollhup "<< std::endl;
delsockfrmepoll(events.data.fd, epollfd);
}
else if (events.events & epollin)
{
bool iostatus = false;
iostatus = readbuffer(events.data.fd, recvbuffer, 126); //126是xml的长度
if (iostatus)
{
/*
std::cout << "fd is : " <<events.data.fd << std::endl;
std::cout << "recvbuffer is : " <<recvbuffer << std::endl;
*/
resetsockout(events.data.fd, epollfd);
}
else
{
delsockfrmepoll(events.data.fd, epollfd);
}
}
else if (events.events & epollout)
{
if (strncmp(recvbuffer, protocoltwo, strlen(recvbuffer)) == 0)
{
strncpy(sendbuffer, responsetwo, strlen(responsetwo));
bool iostatus = false;
iostatus = sendbuffertoclient(events.data.fd, sendbuffer, strlen(sendbuffer));
if (iostatus)
{ /*
std::cout << "fd is : " <<events.data.fd << std::endl;
std::cout << "sendbuffer is : " <<sendbuffer << std::endl;
*/
resetsockin(events.data.fd, epollfd);
}
else
{
delsockfrmepoll(events.data.fd, epollfd);
}
}
}
}
}
}
return 0;
}