#include "main.h" //====================================================================== // MAIN //====================================================================== int main(int argc, char **argv) { int txtPortNumber,binPortNumber; struct sockaddr_in myAddr; fd_set rdSet; char msg[0x100]; struct sockaddr_in fromAddr; int32_t value; //---- check command line arguments ---- if(argc!=3) { fprintf(stderr,"usage: %s txt_port bin_port\n",argv[0]); exit(1); } //---- extract local port numbers ---- if(sscanf(argv[1],"%d",&txtPortNumber)!=1) { fprintf(stderr,"invalid port %s\n",argv[1]); exit(1); } if(sscanf(argv[2],"%d",&binPortNumber)!=1) { fprintf(stderr,"invalid port %s\n",argv[1]); exit(1); } //---- create UDP socket (text) ---- int txtUdpSocket=socket(PF_INET,SOCK_DGRAM,0); if(txtUdpSocket==-1) { perror("socket"); exit(1); } // ... bound to any local address on the specified port myAddr.sin_family=AF_INET; myAddr.sin_port=htons(txtPortNumber); myAddr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(txtUdpSocket,(struct sockaddr *)&myAddr,sizeof(myAddr))==-1) { perror("bind"); exit(1); } // ... allowing broadcast (optional) int on=1; if(setsockopt(txtUdpSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int))==-1) { perror("setsockopt"); exit(1); } //---- create UDP socket (binary) ---- int binUdpSocket=socket(PF_INET,SOCK_DGRAM,0); if(binUdpSocket==-1) { perror("socket"); exit(1); } // ... bound to any local address on the specified port myAddr.sin_family=AF_INET; myAddr.sin_port=htons(binPortNumber); myAddr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(binUdpSocket,(struct sockaddr *)&myAddr,sizeof(myAddr))==-1) { perror("bind"); exit(1); } // ... allowing broadcast (optional) on=1; if(setsockopt(binUdpSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int))==-1) { perror("setsockopt"); exit(1); } for(;;) { //---- wait for incoming informations ---- FD_ZERO(&rdSet); FD_SET(0,&rdSet); // standard input FD_SET(txtUdpSocket,&rdSet); FD_SET(binUdpSocket,&rdSet); int maxFd=txtUdpSocket>binUdpSocket ? txtUdpSocket : binUdpSocket; // SELECT if(select(maxFd+1,&rdSet,(fd_set *)0,(fd_set *)0,(struct timeval *)0)==-1) { perror("select"); exit(1); } //---- display standard input (if available) ---- if(FD_ISSET(0,&rdSet)) { if(fgets(msg,0x100,stdin)) { printf("standard input: %s\n",msg); } } //---- receive text message (if available) ---- if(FD_ISSET(txtUdpSocket,&rdSet)) { socklen_t len=sizeof(fromAddr); int r=recvfrom(txtUdpSocket,msg,0x100,0,(struct sockaddr *)&fromAddr,&len); if(r==-1) { perror("recvfrom"); exit(1); } //---- display message and source address/port ---- msg[r]='\0'; printf("text message from %s:%d : %s\n", inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port),msg); } //---- receive 32-bit value (if available) ---- if(FD_ISSET(binUdpSocket,&rdSet)) { socklen_t len=sizeof(fromAddr); int r=recvfrom(binUdpSocket,&value,4,0,(struct sockaddr *)&fromAddr,&len); if(r==-1) { perror("recvfrom"); exit(1); } //---- convert to host format 32-bit integer ---- if(r<4) { fprintf(stderr,"4 bytes expected\n"); exit(1); } value=ntohl(value); //---- display value and source address/port ---- printf("binary value from %s:%d : %d\n", inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port),value); } } close(txtUdpSocket); close(binUdpSocket); return 0; } //----------------------------------------------------------------------------