Note that there are some explanatory texts on larger screens.

plurals
  1. POselect() invalid argument
    primarykey
    data
    text
    <p>I have an array of 6 sockets, each designed to listen for incoming messages. On each socket, I need to call select() to listen for incoming messages. This code compiles, but when I run it, I get a message </p> <p><code>select failure: Invalid argument</code></p> <p><code>errno: 22</code></p> <p>Can anyone see what I am doing wrong? Thanks!</p> <p>This code is in int main():</p> <pre><code>int listenfd[6]; fd_set read_set; struct timeval tv; time_t start_time; make_connections(listenfd, neighbor, servAddr, read_set); FD_ZERO(&amp;read_set); // add the accepted connections to the read set for use with select() for (i=0; i&lt;6; i++) { FD_SET(listenfd[i], &amp;read_set); } tv.tv_sec = 5; // seconds tv.tv_usec = 5000000; // microseconds gettimeofday(&amp;tv, NULL); start_time = tv.tv_sec; // EDIT: made the following change per suggestion by ThePelaton // same error exists, though //if ( (select(6, &amp;read_set, NULL, NULL, &amp;tv)) == -1) { int max = listenfd[0]; for (i=1; i&lt;6; i++) { if (listenfd[i] &gt; listenfd[i-1]) { max = i; } } if ( (select(listenfd[max]+1, &amp;read_set, NULL, NULL, &amp;tv)) == -1) { perror("select failure"); fprintf(stdout, "errno: %d\n", errno); exit(EXIT_FAILURE); } </code></pre> <p>My other function:</p> <pre><code>void make_connections(int listenfd[6], Neighbor neighbor[6], struct sockaddr_in servAddr, fd_set read_set) { int num_hosts = 6; int i, rc, on=1; struct sockaddr_storage their_addr; socklen_t addr_size; for (i=0; i&lt;6; i++) { // Create one socket for each neighbor if((listenfd[i] = socket(AF_INET, SOCK_STREAM, 0)) &lt; 0) { exit(1); } /*************************************************************/ /* Allow socket descriptor to be reuseable */ /*************************************************************/ rc = setsockopt(listenfd[i], SOL_SOCKET, SO_REUSEADDR, (char *)&amp;on, sizeof(on)); if (rc &lt; 0) { perror("setsockopt() failed"); close(listenfd[i]); exit(-1); } /*************************************************************/ /* Set socket to be non-blocking. All of the sockets for */ /* the incoming connections will also be non-blocking since */ /* they will inherit that state from the listening socket. */ /*************************************************************/ rc = ioctl(listenfd[i], FIONBIO, (char *)&amp;on); if (rc &lt; 0) { perror("ioctl() failed"); close(listenfd[i]); exit(-1); } /* get server IP address (input must be IP address, not DNS name) */ bzero(&amp;servAddr,sizeof(servAddr)); //zero the struct servAddr.sin_family = AF_INET; //address family (ipv4) servAddr.sin_port = htons(neighbor.port); //sets port to network byte order servAddr.sin_addr.s_addr = INADDR_ANY; // first attempt to bind / listen on each port if (bind(listenfd[i], (struct sockaddr *)&amp;servAddr, sizeof(servAddr)) &lt; 0) { perror("bind failed"); exit (-1); } if (listen(listenfd[i], 10) &lt; 0) { perror("listen() failed"); exit (-1); } } } </code></pre> <p>EDIT 2: Pretty sure that I figured this out. I was using my time value (tv) to do some timestamping of my process. Looks like that is where the invalid argument comes from, not from the sockets.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload