#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#define MAX_EVENTS 10
void do_use_fd(unsigned int events);
void setnonblocking(int sockfd)
{
int opts = fcntl(sockfd,F_GETFL);
if(opts < 0)
return;
opts = opts | O_NONBLOCK;
fcntl(sockfd,F_SETFL,opts);
}
int main()
{
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;
struct sockaddr_in local;
struct sockaddr_in servaddr;
char *ip = "172.16.38.21";
socklen_t addrlen;
/* Set up listening socket, 'listen_sock' (socket(),
bind(), listen()) */
epollfd = epoll_create(10);
if (epollfd == -1) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
listen_sock = socket(AF_INET, SOCK_STREAM, 0);
setnonblocking(listen_sock);
int flag = 1;
setsockopt(listen_sock,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(int));
inet_pton(AF_INET,"172.16.38.21",&servaddr.sin_addr);
servaddr.sin_port = htons(9998);
bind(listen_sock,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listen_sock,1024);
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
int n;
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].events);
}
}
}
}
void do_use_fd(unsigned int events)
{
if (events & EPOLLIN)
{
printf("epoll in events\n");
}
if (events & EPOLLOUT)
{
printf("epoll out events\n");
sleep(1);
}
if ((events & EPOLLERR) || (events & EPOLLHUP))
{
printf("epoll err events\n");
}
}
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#define MAX_EVENTS 10
void do_use_fd(unsigned int events);
void setnonblocking(int sockfd)
{
int opts = fcntl(sockfd,F_GETFL);
if(opts < 0)
return;
opts = opts | O_NONBLOCK;
fcntl(sockfd,F_SETFL,opts);
}
int main()
{
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;
struct sockaddr_in local;
struct sockaddr_in servaddr;
char *ip = "172.16.38.21";
socklen_t addrlen;
/* Set up listening socket, 'listen_sock' (socket(),
bind(), listen()) */
epollfd = epoll_create(10);
if (epollfd == -1) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
listen_sock = socket(AF_INET, SOCK_STREAM, 0);
setnonblocking(listen_sock);
int flag = 1;
setsockopt(listen_sock,SOL_SOCKET,SO_REUSEADDR,&flag,sizeof(int));
inet_pton(AF_INET,"172.16.38.21",&servaddr.sin_addr);
servaddr.sin_port = htons(9998);
bind(listen_sock,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listen_sock,1024);
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
int n;
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].events);
}
}
}
}
void do_use_fd(unsigned int events)
{
if (events & EPOLLIN)
{
printf("epoll in events\n");
}
if (events & EPOLLOUT)
{
printf("epoll out events\n");
sleep(1);
}
if ((events & EPOLLERR) || (events & EPOLLHUP))
{
printf("epoll err events\n");
}
}