linux - Blocking recvfrom with select system call -


i have udp client has receive form 2 different sockets.
using select system call multiplex recv call.

but seeing client blocked inside second recv call.

how can resolve issue?

struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; int activity;  fd_zero(&socketfds); fd_set(usocket,&socketfds); max_sd = std::max(max_sd, usocket); fd_set(msocket,&socketfds); max_sd = std::max(max_sd, msocket); rset = socketfds;  {       rset = socketfds;       activity = select( max_sd + 1 , &rset , null , null , &timeout); } while(activity<0 && errno == eintr);  if ((activity < 0) && (errno!=eintr)) {      printf("select error"); } if(fd_isset(usocket, &socketfds)) {       int len;       printf("receiving unicast socket..\n");       if((len = recvfrom(usocket, databuffer, datalength, 0, (struct sockaddr *)      &clientaddr, &clen) < 0) )      {            printf("error reading message \n");            close(msocket);            exit(-1);      }      else      {              printf("size of message: %d\n", strlen(databuffer));              handlemessage(databuffer);      } } if(fd_isset(msocket, &socketfds)) {      printf("receiving multicast socket..\n");      if((recvfrom(msocket, databuffer, datalength, 0, (struct sockaddr *)      &multicastclientaddr, &mlen) < 0) )     {        printf("error reading message \n");        close(msocket);        exit(-1);     }     else     {       printf("message server:%s\n", databuffer);       handlemessage(databuffer);     } } 

you need check rset returned (modified) select see if sockets ready read -- bits set in socketfds since master set of sockets wait for. change the

if(fd_isset(xsocket, &socketfds)) 

lines to

if(fd_isset(xsocket, &rset)) 

Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -