From owner-freebsd-hackers@FreeBSD.ORG Mon Aug 8 14:50:45 2005 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CCE0F16A41F for ; Mon, 8 Aug 2005 14:50:45 +0000 (GMT) (envelope-from fenix@ramb.com.ua) Received: from zero.ramb.com.ua (zero.ramb.com.ua [62.149.0.90]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3ADBA43D48 for ; Mon, 8 Aug 2005 14:50:44 +0000 (GMT) (envelope-from fenix@ramb.com.ua) Received: from [195.78.58.42] (sirius.ramb.com.ua [195.78.58.42]) by zero.ramb.com.ua (8.13.3/8.13.3) with ESMTP id j78I0Ef6034211 for ; Mon, 8 Aug 2005 18:00:24 GMT (envelope-from fenix@ramb.com.ua) Message-ID: <42F771A8.90600@ramb.com.ua> Date: Mon, 08 Aug 2005 17:52:24 +0300 From: "Sergey S. Ropchan" User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050624) X-Accept-Language: en-us, en MIME-Version: 1.0 To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV 0.80/1002/Wed Aug 3 10:29:36 2005 clamav-milter version 0.80j on zero.ramb.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=6.3 tests=none autolearn=failed version=3.0.2 X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on zero.ramb.com.ua Subject: libevent and pre-forked server ... X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Aug 2005 14:50:46 -0000 Hi All I'm trying to create pre-forked server and trying to use libevent for accepting connections per worker process. Source code below. In result, only one forked process (worker) accept connection ! What i'm doing wrong !? Thanks. #include #include #include #include #include #include #include #include #include #include #include #define PORT 12000 #define MAXCONN 1024 #define MAXWORKERS 3 #define WORKER_TIMEOUT 1 void handle_connection(const int lsd, short event, void *ev); void make_worker(const int lsd); int main(void) { int workers; int lsd, reuse = 1; struct sockaddr_in sa; pid_t pid; bzero(&sa, sizeof(sa)); if ((lsd = socket(AF_INET, SOCK_STREAM, 0)) < 0) errx(1, "socket: %s (%d)\n", strerror(errno), errno); if (setsockopt(lsd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) errx(2, "setsockopt: %s (%d)\n", strerror(errno), errno); sa.sin_family = AF_INET; sa.sin_port = htons(PORT); sa.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(lsd, (struct sockaddr *)&sa, sizeof(sa)) < 0) errx(3, "bind: %s (%d)\n", strerror(errno), errno); if (listen(lsd, MAXCONN) < 0) errx(4, "listen: %s (%d)\n", strerror(errno), errno); (void)fprintf(stderr, "Server is ready to accept clients\n"); workers = 0; for (;;) { if (workers < MAXWORKERS) { if((pid=fork()) == 0) { (void)fprintf(stderr, "Worker [%d] created\n", getpid()); make_worker(lsd); } else if ( pid > 0) workers++; else errx(6, "fork: %s(%d)\n", strerror(errno), errno); } else sleep(WORKER_TIMEOUT); } return 0; } void make_worker(const int lsd) { struct event ev; bzero(&ev, sizeof(ev)); event_init(); event_set(&ev, lsd, EV_READ | EV_PERSIST, handle_connection, &ev); if(event_add(&ev, NULL) < 0) errx(5, "event_add: %s (%d)\n", strerror(errno), errno); event_dispatch(); (void)fprintf(stderr, "aborted\n"); } void handle_connection(const int lsd, short event, void *ev) { struct sockaddr_in remote; int asd = 0, socklen = 0, flags = 0; pid_t pid = getpid(); socklen = sizeof(remote); bzero(&remote, socklen); event_add(ev, NULL); asd = accept(lsd, (struct sockaddr *)&remote, &socklen); if (asd > 0) { (void)fprintf(stderr, "#worker[%d]: received connection from: %s:%d, socket: %d\n", pid, inet_ntoa(remote.sin_addr), ntohs(remote.sin_port), asd); } else errx(6, "accept: %s (%d)\n", strerror(errno), errno); }