最近android项目 NDK用到的EPOLL
#define MAX_SIZE 4096
#define BYTE unsigned char
int epfd;
int set_non_blocking(int socket_fd)
{
if (fcntl(socket_fd, F_SETFL, fcntl(socket_fd, F_GETFL)|O_NONBLOCK) == -1)
{
return -1;
}
return 0;
}
void startServer(int port,int Max_Buff_Size)
{
int server_id = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(server_id < 0)
{
return;
}
int reuse = 1;
if(setsockopt(server_id,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
{
return;
}
int size = Max_Buff_Size;
if(setsockopt(server_id,SOL_SOCKET,SO_RCVBUF,&size, sizeof(size)) < 0)
{
return;
}
set_non_blocking(server_id);
struct sockaddr_in addr_in;
memset(&addr_in,0,sizeof(sockaddr_in));
addr_in.sin_family = AF_INET;
addr_in.sin_addr.s_addr = htons(INADDR_ANY);
addr_in.sin_port = htons(port);
if(bind(server_id,(const struct sockaddr*)&addr_in,sizeof(sockaddr_in)) < 0)
{
return;
}
if(listen(server_id,65535) < 0)
{
return;
}
epoll_event ev;
epoll_event events[MAX_SIZE];
epfd = epoll_create(MAX_SIZE);
ev.events = EPOLLIN;
ev.data.fd = server_id;
if(epoll_ctl(epfd,EPOLL_CTL_ADD,server_id,&ev) < 0)
{
return;
}
BYTE buf[Max_Buff_Size];
while(true)
{
int nfds = epoll_wait(epfd,events,MAX_SIZE,-1);
if(nfds < 0 && errno != EINTR)
{
break;
}
for(int n = 0;n < nfds;++n)
{
if(events[n].data.fd == server_id)
{
struct sockaddr_in remote_in;
socklen_t len_t = sizeof(remote_in);
int client_socket = accept(server_id,(sockaddr*)&remote_in,&len_t);
if(client_socket < 0)
{
continue;
}
set_non_blocking(client_socket);
ev.events = EPOLLIN;
ev.data.fd = client_socket;
epoll_ctl(epfd,EPOLL_CTL_ADD,client_socket,&ev);
}
else if(events[n].events & EPOLLIN)
{
int client_socket = events[n].data.fd;
if(client_socket < 0){ continue; }
memset(&buf,0,sizeof(buf));
ssize_t ret = recv(client_socket,buf,sizeof(buf),0);
if(ret <= 0)
{
close(client_socket);
ev = events[n];
epoll_ctl(epfd, EPOLL_CTL_DEL, client_socket, &ev);
continue;
}else{
//处理接收的数据
/*
...
*/
}
}
}
}
}