| PLEX86 | ||
|
epoll problemI programmed simple tcp server using nonblocking sockets and epoll. But I am facing some problems. Filesystems created identically, but have different sizes I've inherited a build process that creates a filesystem-in-a-file using a bash script which goes, in part, like this: dd if=-dev-zero of=fsfile bs=1024 count=4096 mke2fs -F fsfile... 1. I can recv from eventsi.data.fd but I can't send any data over eventsi.data.fd 2. When I make multiple connections at once (say 100) I get segmentation fault... What am I doing wrong? (you can find source code that making multiple connections under topic "multi-thread server, pthreads, sleep". it is test.c) source code is here -------------- epollserver.c ------------------ $ cc epollserver -o epollserver -------------------------------------------------- #define MAXCLIENT 101 #define PORT 3355 #define DEBUG int listenfd; void nonblock(int sockfd) { int opts; opts = fcntl(sockfd, FGETFL); { perror("fcntl(FGETFL)-n"); exit(1); } opts = (opts ONONBLOCK); { perror("fcntl(FSETFL)-n"); exit(1); } } int main() { int epfd; struct epollevent *events; struct epollevent ev; struct sockaddrin srv; int clifd; int i; int n; int res; char buffer1024; { perror("sockfd-n"); exit(1); } bzero(&srv, sizeof(srv)); srv.sinfamily = AFINET; srv.sinaddr.saddr = INADDRANY; srv.sinport = htons(PORT); { perror("bind-n"); exit(1); } listen(listenfd, 1024); epfd = epollcreate(MAXCLIENT); if(!epfd) { perror("epollcreate-n"); exit(1); } ev.events = EPOLLIN EPOLLERR EPOLLHUP; ev.data.fd = listenfd; { perror("epollctl, adding listenfd-n"); exit(1); } for( ; ; ) { res = epollwait(epfd, events, MAXCLIENT, 0); { if(eventsi.data.fd == listenfd) { clifd = accept(listenfd, NULL, NULL); { nonblock(clifd); ev.events = EPOLLIN EPOLLET; ev.data.fd = clifd; { perror("epollctl ADD-n"); exit(1); } } } else { n = recv(eventsi.data.fd, buffer, 1023, 0); if(n == 0) { #ifdef DEBUG printf("%d closed connection-n", eventsi.data.fd); epollctl(epfd, EPOLLCTLDEL, eventsi.data.fd, NULL); #endif } { #ifdef DEBUG printf("%d error occured, errno: %d-n", eventsi.data.fd, errno); #endif } else { #ifdef DEBUG printf("%d data received: %s-n", eventsi.data.fd, buffer); bzero(&buffer, strlen(buffer)); #endif send(eventsi.data.fd, buffer, strlen(buffer), 0); } } } } return 0; }
|
||||
Filesystems created identically, but have different sizes Linux groups from Newsgroups The #1 Usenet Provider on the Internet
|
||||