Subj : Re: multi-threaded server, pthreads & sleep To : comp.unix.programmer,comp.programming.threads From : parahat Date : Wed Mar 16 2005 03:48 pm "David Schwartz" wrote in message news:... > "Parahat Melayev" wrote in message > news:5bb6e2ec.0503161125.5d63e85f@posting.google.com... > > > yes I programmed using select firstly, actually. but it is not doing > > what it is supposed to do, when I connect 1000 client at once. > > You're going to have to get more sophisticated if you want to handle > more than a few hundred concurrent connections. You'll at minimum need to > use 'poll' instead of 'select'. You may need to raise resource limits also. > It's hard to know exactly what your issue is because "it is not doing what > it is supposed to do" is a very vague description of the problem. > > DS Here is simple server code using epoll. but I am again facing some problems here. - I can recv from events[i].data.fd but I can't send any data over events[i].data.fd - When I make multiple connections at once (say 100) I get segmentation fault... -------- epollserver.c ------------ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_CLIENT 101 #define PORT 3355 #define DEBUG int listenfd; void nonblock(int sockfd) { int opts; opts = fcntl(sockfd, F_GETFL); if(opts < 0) { perror("fcntl(F_GETFL)\n"); exit(1); } opts = (opts | O_NONBLOCK); if(fcntl(sockfd, F_SETFL, opts) < 0) { perror("fcntl(F_SETFL)\n"); exit(1); } } int main() { int epfd; struct epoll_event *events; struct epoll_event ev; struct sockaddr_in srv; int clifd; int i; int n; int res; char buffer[1024]; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("sockfd\n"); exit(1); } bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_addr.s_addr = INADDR_ANY; srv.sin_port = htons(PORT); if( bind(listenfd, (struct sockaddr *) &srv, sizeof(srv)) < 0) { perror("bind\n"); exit(1); } listen(listenfd, 1024); epfd = epoll_create(MAX_CLIENT); if(!epfd) { perror("epoll_create\n"); exit(1); } ev.events = EPOLLIN | EPOLLERR | EPOLLHUP; ev.data.fd = listenfd; if(epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev) < 0) { perror("epoll_ctl, adding listenfd\n"); exit(1); } for( ; ; ) { res = epoll_wait(epfd, events, MAX_CLIENT, 0); for(i = 0; i < res; i++) { if(events[i].data.fd == listenfd) { clifd = accept(listenfd, NULL, NULL); if(clifd > 0) { nonblock(clifd); ev.events = EPOLLIN | EPOLLET; ev.data.fd = clifd; if(epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev) < 0) { perror("epoll_ctl ADD\n"); exit(1); } } } else { n = recv(events[i].data.fd, buffer, 1023, 0); if(n == 0) { #ifdef DEBUG printf("%d closed connection\n", events[i].data.fd); epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL); #endif } else if(n < 0) { #ifdef DEBUG printf("%d error occured, errno: %d\n", events[i].data.fd, errno); #endif } else { #ifdef DEBUG printf("%d data received: %s\n", events[i].data.fd, buffer); bzero(&buffer, strlen(buffer)); #endif send(events[i].data.fd, buffer, strlen(buffer), 0); } } } } return 0; } .