c - Read error with epoll on a (pre)forked server -


i starting learn epoll , wanted create small server play it. there lots of discussions on web can't manage put hands on reliable documentation...

here structure of program have far (i've cleaned clarity) :

int sfd = create_and_bind(port_number); make_non_blocking(sfd); listen(sfd);  int efd = epoll_create1(0); event.data.fd = sfd; event.events = epollin | epollet; epoll_ctl(efd, epoll_ctl_add, sfd, &event);  struct epoll_event *events = calloc(maxevents, sizeof event);  int p, pid = 1; (p = 0; p < 2; ++i) {     if (pid > 0) {         pid = fork();     } }  if(pid == 0) {     while(1) {         int n, i;         n = epoll_wait(efd, events, maxevents, -1);         for(i = 0; < n; ++i) {             if ((events[i].events & epollerr) || (events[i].events & epollhup) || (!(events[i].events & epollin))) {                 // closing socket                 close(events[i].data.fd);                 continue;             } else if (sfd == events[i].data.fd) {                 // incoming connection                  int infd = accept(sfd, &in_addr, &in_len);                 // break while if call blocks                 make_socket_non_blocking(infd);                  event.data.fd = infd;                 event.events = epollin | epollet;                 epoll_ctl(efd, epoll_ctl_add, infd, &event);             } else {                 // ready read                 ssize_t count = read(events[i].data.fd, buf, sizeof buf);                  //                 // here problems                 //                 if (count == -1) {                     /* if errno == eagain, means have read                      data. go main loop. */                     if (errno != eagain) {                         perror("read");                         done = 1;                     }                     break;                 } else if (count == 0) {                     /* end of file. remote has closed                      connection. */                     done = 1;                     break;                 }                  if(done) {                     close(events[i].data.fd);                 }             }         }     } } 

i've done simple forked client test 10 concurrent connection , every time 1 :

read : bad file descriptor 

am missing here ?

thanks

ps : have left bits of code thought relevant... here rest : http://pastebin.com/5vttunft


Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -