Note that there are some explanatory texts on larger screens.

plurals
  1. POC socket programming: calling recv() changes my socket file descriptor?
    text
    copied!<p>Hey all, I have this strange problem with recv(). I'm programming client/server where client send() a message (a structure to be exact) and server recv() it. I am also working with multiple sockets and select(). </p> <pre><code>while(1) { readset = info-&gt;read_set; info-&gt;copy_set = info-&gt;read_set; timeout.tv_sec = 1; timeout.tv_usec = 0; // 0.5 seconds ready = select(info-&gt;max_fd+1, &amp;readset, NULL, NULL, &amp;timeout); if (ready == -1) { printf("S: ERROR: select(): %s\nEXITING...", strerror(errno)); exit(1); } else if (ready == 0) { continue; } else { printf("S: oh finally you have contacted me!\n"); for(i = 0; i &lt; (info-&gt;max_fd+1); i++) { if(FD_ISSET(i, &amp;readset)) //this is where problem begins { printf("S: %i is set\n", i); printf("S: we talking about socket %i son\n", i); // i = 4 num_bytes = recv(i, &amp;msg, MAX_MSG_BYTE, 0); printf("S: number of bytes recieved in socket %i is %i\n", i, num_bytes); // prints out i = 0 what?? if (num_bytes == 0) { printf("S: socket has been closed\n"); break; } else if (num_bytes == -1) { printf("S: ERROR recv: %d %s \n", i, strerror(errno)); continue; } else { handle_request(arg, &amp;msg); printf("S: msg says %s\n", msg-&gt;_payload); } } // if (FD_ISSET(i, &amp;readset) else printf("S: %i is not set\n", i); } // for (i = 0; i &lt; maxfd+1; i++) to check sockets for msg } // if (ready == -1) info-&gt;read_set = info-&gt;copy_set; printf("S: copied\n"); } </code></pre> <p>the problem I have is that in <code>read_set</code>, 0~3 aren't set and 4 is. That is fine. But when i call <code>recv()</code>, <code>i</code> suddently becomes 0. Why is that? It doesn't make sense to me why <code>recv()</code> would take an socket file descriptor number and modify to another number. Is that normal? Am I missing something?</p> <pre><code>S: 0 is not set S: 1 is not set S: 2 is not set S: 3 is not set S: 4 is set S: we talking about socket 4 son S: i is strangely or unstrangely 0 S: number of bytes recieved in socket 0 is 40 </code></pre> <p>That's what it prints out.</p>
 

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