I'm trying to wrap my head around calling select
on sockets and I can't understand what I'm doing wrong.
setup_server_socket
calls bind
and listen
and sets the socket to nonblocking mode.
The following code blocks on the select
call it seems, not moving forward to FD_ISSET
. I tried connecting a client and it seems to succeed but select
never returns anything.
What's the proper way to do this?
...
int listenfd = setup_server_socket( serverPort );
if( -1 == listenfd )
return 1;
fd_set read_fds;
FD_ZERO(&read_fds);
int fdmax = listenfd;
// loop forever
while( 1 )
{
if (select(fdmax+1, &read_fds, NULL,NULL,NULL) == -1){
perror("select");
exit(4);
}
for (int i = 0; i<= fdmax; i++){
printf("Testing: %d, %d\n", i, FD_ISSET(i,&read_fds));
}return 0;
...
Read several times syscalls(2), select(2), select_tut(2), poll(2), errno(3) (BTW, you should prefer poll(2) to the obsolete select
, which don't handle file descriptors bigger than __FD_SETSIZE
, i.e. 1024 on my Linux/Debian/x86-64 system).
Then:
fd_set read_fds;
FD_ZERO(&read_fds);
int fdmax = listenfd;
FD_SET(listenfd, &read_fds);
should go inside the while(1)
loop, before calling select
. BTW, I recommend using poll
instead of select
Read also about the C10k problem
Don't forget that select
is changing its given fd_set
-s (and usually wants them to be non-empty)...
Perhaps use strace(1) and gdb(1). If you compile with GCC, invoke it as gcc -Wall -Wextra -g
to get more warnings and debug info. If you compile your C code with Clang, consider using the Clang Static Analyzer.
Read also Advanced Linux Programming (it is a free book that you could also read on paper, or download from several other places, e.g. this etc...)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With