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
Post a Comment