#include "main.h" //====================================================================== // MAIN //====================================================================== int main(int argc, char **argv) { int ok; int portNumber; struct sockaddr_in myAddr; struct sockaddr_in fromAddr; int32_t value; //---- check command line arguments ---- if(argc!=2) { fprintf(stderr,"usage: %s port\n",argv[0]); exit(1); } //---- extract local port number ---- if(sscanf(argv[1],"%d",&portNumber)!=1){ fprintf(stderr,"invalid port %s\n",argv[1]); exit(1); } //---- create UDP socket ---- int udpSocket=socket(PF_INET,SOCK_DGRAM,0); // SOCK_DGRAM == UDP if( udpSocket==-1 ) { perror("socket"); exit(1); } // ... bound to any local address on the specified port myAddr.sin_family=AF_INET; myAddr.sin_port=htons(portNumber); myAddr.sin_addr.s_addr=htonl(INADDR_ANY); ok = bind(udpSocket,(struct sockaddr *)&myAddr,sizeof(myAddr)); if( ok == -1) { perror("bind"); exit(1); } // ... allowing broadcast (optional) int on=1; ok = setsockopt(udpSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int)); if( ok == -1) { perror("setsockopt"); exit(1); } for(;;) { //---- receive message ---- socklen_t len=sizeof(fromAddr); int r=recvfrom(udpSocket,&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("from %s:%d : %d\n", inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port),value); } close(udpSocket); } //^^^^^^^^^^^^^^^^^^^^^^^^^^ EOF ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^