#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/select.h>
#include <sys/epoll.h>
#define MAX_BUFFER_SIZE 128
#define MAX_EPOLL 100
int mz_ipv4_tcp_create_socket()
{
int listenfd, sockfd, opt = 1;
struct sockaddr_in server, client;
socklen_t len;
int timep;
int ret;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0){
perror("Create socket fail.");
return -1;
}
if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
perror("Error, set socket reuse addr failed");
return -1;
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = htonl(INADDR_ANY);
len = sizeof(struct sockaddr);
if(bind(listenfd, (struct sockaddr *)&server, len)<0){
perror("bind error.");
return -1;
}
listen(listenfd, 10);
return listenfd;
}
int main(int argc,char *argv[])
{
int clientfd,sockfd,maxfd,fd[1024];
struct sockaddr_in clienaddr;
socklen_t len;
struct epoll_event ev ,event[MAX_EPOLL];
int epfd;
int ret,num;
int i=0;
char readbuf[100];
memset(readbuf,0,sizeof(readbuf));
sockfd=mz_ipv4_tcp_create_socket();
epfd=epoll_create(MAX_EPOLL);
if(epfd<0)
{
perror("epoll_create error");
exit(1);
}
ev.events = EPOLLIN;
ev.data.fd=sockfd;
ret=epoll_ctl(epfd, EPOLL_CTL_ADD,sockfd,&ev);
if(ret==-1)
{
perror("epoll ctl error 1111");
exit(1);
}
len =sizeof(clienaddr);
while(1)
{
if((num=epoll_wait(epfd,event,MAX_EPOLL,-1))==-1)
{
perror("wait error");
exit(1);
}
for(i=0;i<num;i++)
{
if(event[i].data.fd==sockfd)
{
clientfd = accept(sockfd, (struct sockaddr *)&clienaddr, &len);
if(clientfd==-1)
{
perror("ccept error");
exit(1);
}
ev.data.fd=clientfd;
ev.events =EPOLLIN;
ret=epoll_ctl(epfd, EPOLL_CTL_ADD,clientfd,&ev);
if(ret==-1)
{
perror("epoll ctl error22222");
exit(1);
}
}
else if(event[i].events&EPOLLIN)
{
ret=recv(event[i].data.fd,readbuf,sizeof(readbuf),0);
if(ret==-1)
{
perror("recv error");
exit(1);
}else if(ret ==0 )
{
ev.data.fd=event[i].data.fd;
ev.events=EPOLLIN;
epoll_ctl(epfd,EPOLL_CTL_DEL,event[i].data.fd,&ev);
close(event[i].data.fd);
}
printf("%d recv %s \n",event[i].data.fd,readbuf);
memset(readbuf,0,sizeof(readbuf));
}
}
}
}