Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing select() system call for listening on stdin and the server
    text
    copied!<p>I want to use select system call to multiplex STDIN and SOCKFD (connected to a server) such that I must be listening to both STDIN and SOCKFD and depending upon where the data is available for read I must proceed further.</p> <p>Note: #define STDIN 0</p> <p>This is what happens when I do the following. </p> <ul> <li>I connect to the server the usual way [ socket() then connect() ] </li> <li>I add STDIN and connection socket descriptor 'SOCKFD' to the fd_set (named 'readset') meant for reading. </li> <li>Then I call select(). </li> <li>Use FD_ISSET to determine which fd is ready for read. </li> </ul> <p>The problem with this set up is that FD_ISSET is always true for both the fd. Once I get connected to the server I see FD_ISSET(sockfd, &amp;readset) is always true and so is FD_ISSET(STDIN, &amp;readset) whether, the server is sending data or not or if I am entering data from keyboard or not. </p> <p>What could I be doing wrong? </p> <p>/* connection successful */</p> <pre><code>FD_ZERO(&amp;connset); while(1) { FD_SET(sockfd,&amp;connset); /* add sockfd to connset */ FD_SET(STDIN,&amp;connset); /* add STDIN to connset */ fdmax=sockfd; if(select(fdmax+1,&amp;readset,NULL,NULL,NULL)&lt;0){ fprintf(stdout, "select() error\n"); exit(0); } /* select returned * check which socket is set */ if(FD_ISSET(sockfd,&amp;connset)) { /* * Server sends msglen * client reads msg of length msglen * client prints it to stdout * client waits for next activity of its listen sockets */ size=4; ptr=(char *)&amp;msglen; while(1) { if((nread=recv(sockfd,ptr,size,0)),MSG_DONTWAIT) { close(sockfd); exit(0); } size-=nread; ptr+=nread; } bytesToRead = ntohl(msglen); readbuf = (char *)malloc(sizeof(char)*(bytesToRead+1)); ptr=readbuf; while(1) { nread=recv(sockfd,ptr,bytesToRead,MSG_DONTWAIT); if(nread&lt;=0) { close(sockfd); exit(0); } bytesToRead-=nread; ptr+=nread; } /* msg read successfully */ *ptr='\0'; fprintf(stdout, "in: %s\n",readbuf); free(readbuf); } if(FD_ISSET(STDIN,&amp;connset)) { /* data at STDIN */ fgets(buf,2,stdin); /* read the first newline char (&lt; enter &gt;) */ fprintf(stdout,"Enter msg: "); fgets(buf,MAXLEN,stdin); /* read the msg */ buf[strlen(buf)-1]='\0'; msglen = htonl((uint32_t)(strlen(buf)-1)); ptr = (char *)&amp;msglen; bytesToSend = sizeof(uint32_t); cnt = bytesToSend; while(cnt&gt;0) { if((nsent=send(sockfd,ptr,cnt,0))&gt;0) { cnt-=nsent; ptr+=nsent; } else { fprintf(stdout,"send error\n"); exit(0); } } ptr=buf; bytesToSend=(uint32_t)(strlen(buf)-1); cnt=bytesToSend; while(cnt&gt;0) { if((nsent=send(sockfd,ptr,cnt,0))&gt;0) { cnt-=nsent; ptr+=nsent; } else { fprintf(stdout,"send error\n"); exit(0); } } } } return 0; </code></pre> <p>}</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