Date: Sun, 30 Mar 1997 18:28:57 BST From: Michael Searle <searle@longacre.demon.co.uk> To: questions@freebsd.org Subject: Problem with select() Message-ID: <m731106DD@longacre.demon.co.uk>
next in thread | raw e-mail | index | archive | help
Please could someone point me in the right direction here? As far as I can see I'm doing as the accept() and select() man pages say, and the same as the ftp client does. I'm writing an Internet server, with a blocking socket. In two places though, I need to do a non-blocking read from it as it is reading from other clients at the same time. In the first, it is checking for a new client, so I am selecting on read (to check whether I can call accept() without blocking.) The other is similar, but the sockets are already open - it's just a normal select on read. Without the select, it works OK, but blocks until a client connects - as expected. With it, the select never returns 1 so it never gets to being able to accept the client. These are the relevant bits of code: struct fd_set sel; struct fd_set ready; struct timeval timezero; <snip> timezero.tv_sec = 0; timezero.tv_usec = 0; <snip> serverFd = socket(AF_INET, SOCK_STREAM, DEFAULT_PROTOCOL); <snip> FD_ZERO(&sel); FD_SET(serverFd, &sel); <snip> bind (serverFd, serverSockAddrPtr, serverLen); listen (serverFd, 2); <snip> while (1) { <snip> if (select(1, &sel, (struct fd_set *) 0, (struct fd_set *) 0, &timezero) == 1) { fprintf(stderr,"select OK\n"); newFd = accept (serverFd, clientSockAddrPtr, &clientLen); fprintf(stderr,"accept OK\n"); <snip> for(y=0;y<nextclient;y++) { FD_ZERO(&ready); FD_SET(clientFd[y], &ready); if (select(1, &ready, (struct fd_set *) 0, (struct fd_set *) 0, &timezero) == 1) { <snip> } } Thanks, Michael. -- Michael Searle - searle@longacre.demon.co.uk
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?m731106DD>