epoll
#include
#include
#include
#include
int main()
{
int epfd = epoll_create(256);
int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
struct epoll_event ev;
ev.data.fd = sockSrv;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockSrv, &ev);
struct sockaddr_in addrSrv;
bzero(&addrSrv, sizeof(addrSrv));
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.s_addr = htonl(INADDR_ANY);
addrSrv.sin_port = htons(6000);
bind(sockSrv, (struct sockaddr*)&addrSrv, sizeof(addrSrv));
listen(sockSrv, 3);
int sockConn;
struct sockaddr_in addrConn;
int len = sizeof(addrConn);
int nfds;
struct epoll_event events[20];
char buf[100] = {0};
while(1)
{
nfds = epoll_wait(epfd, events, 20, 500);
int i;
for(i=0; i
{
if(events[i].data.fd == sockSrv)
{
sockConn = accept(sockSrv, (struct sockaddr*)&addrConn, &len);
printf("new connect.\n");
ev.data.fd = sockConn;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockConn, &ev);
}
else if(events[i].events & EPOLLIN)
{
int tmpSock = events[i].data.fd;
if(tmpSock < 0)
continue;
int n = read(sockConn, buf, 100);
if(0 == n)
{
close(sockConn);
events[i].data.fd = -1;
}
else
printf("server recv:%s\n", buf);
ev.data.fd = tmpSock;
ev.events = EPOLLOUT|EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_MOD, tmpSock, &ev);
}
else if(events[i].events & EPOLLOUT)
{
int tmpSock = events[i].data.fd;
write(tmpSock, "parent", strlen("parent"));
ev.data.fd = tmpSock;
ev.events = EPOLLIN|EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_MOD, tmpSock, &ev);
}
}
}
close(sockSrv);
return -1;
}