Hi,
I am facing one typical problem,
I am writing a server program in linux which is waiting for data either on UDP port or on FIFO. I use "Select" call for waiting on data.
But, select only works for UDP or FIFO. that means, if initially (first time after server is started) data comes on UDP port, then select call only listens to UDP port only. It never responds to data on FIFO.
Similarly, if initially data is received by fifo, select call next time responds only to fifo. It never responds for data on UDP port.
Code is give below. Can anybody help me on this? I want to receive data on both FIFO and UDP.
Regards,
Yogesh
Code:
#define SERVER_FIFO_NAME "/tmp/server_fifo"
int main()
{
unsigned char incomingData[MAXBUFSIZE];
int server_fifo_fd; // this is my fifo file descriptor
int server_socket; // this is my socket descriptor
struct sockaddr_in server_address;
int server_len;
int numberOfBytesRead=0;
int dummy_fifo_fd;
fd_set master;
int fdmax;
server_socket=socket(AF_INET,SOCK_DGRAM,0);
if(-1 == server_socket)
{
printf("Error: Creating socket");
exit(1);
}
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=INADDR_ANY;
server_address.sin_port=htons(9734);
memset(&(server_address.sin_zero),0x00,8);
server_len=sizeof(struct sockaddr);
if(-1==bind(server_socket,(struct sockaddr *)&server_address,server_len))
{
printf("Binding Failed\n");
exit(1);
}
FD_ZERO(&master);
mkfifo(SERVER_FIFO_NAME,0777); //fifo created
server_fifo_fd=open(SERVER_FIFO_NAME,O_RDONLY|O_NONBLOCK);
dummy_fifo_fd=open(SERVER_FIFO_NAME,O_WRONLY);
if(-1==server_fifo_fd)
{
perror("Server fifo opening failure");
exit(1);
}
FD_SET(server_fifo_fd,&master); //fifo added to fdmaster list
fdmax=server_fifo_fd;
FD_SET(server_socket,&master); //socket added to fdmaster list
if(server_socket>fdmax)
{
fdmax=server_socket;
}
for(;;)
{
memset(incomingData,'\0',sizeof(incomingData));
if(select(fdmax+1,&master,NULL,NULL,0)==-1) //select call which waits for data
{
perror("Select Failed");
exit(1);
}
if(FD_ISSET(server_fifo_fd,&master)) //if data is on fifo
{
numberOfBytesRead=read(server_fifo_fd,incomingData,sizeof(incomingData));
if(numberOfBytesRead!=0)
{
printf("Printing buffer now %d\n",numberOfBytesRead);
printf("Received from pipe %s\n ", incomingData);
}
}
else if(FD_ISSET(server_socket,&master)) //if data is on udp socket
{
//code for receiveing data from udp
}
//code for processing received data
}//end of for loop
// code for closing fifo and sockets
}//end of main