I have the following code
fd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface);
fdr = raw_socket(client_config.ifindex);
if (fd >= 0) FD_SET(fd, &rfds);
if (fdr >= 0) FD_SET(fdr, &rfds);
max_fd = fd > fdr ? fd : fdr;
retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
if (FD_ISSET(fd, &rfds)) {
....
} else if (FD_ISSET(fdr, &rfds)) {
....
}
If we receive data from the fd
socket, does the FD_ISSET(fd, &rfds)
returns true and FD_ISSET(fdr, &rfds)
returns false?
From the POSIX standards reference page on select
:
FD_ISSET(fd, fdsetp)
shall evaluate to non-zero if the file descriptor fd is a member of the set pointed to by fdsetp, and shall evaluate to zero otherwise.
So exactly what the result of FD_ISSET
(which is really not a function but a macro so technically it doesn't "return" anything) is not mentioned, just that it's either zero or non-zero.
To answer your question, yes. If fd
is readable then FD_ISSET(fd, &rfds)
will be non-zero (true) and FD_ISSET(fdr, &rfds)
will be zero (false) (unless it's also readable, so don't use else if
there, both might be true).