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
Post a Comment