www.pudn.com > vxworks_networking.rar > broadcastGet.c


/* broadcastGet.c - demo for getting a broadcast message */
  
 /* Copyright 1984-1997 Wind River Systems, Inc. */
 
 /*
 modification history
 --------------------
 01d,15Sep97,mm   cast arg 2 of bind
 01c,15Sep97,mm   defined function broadcastGet
 01b,15Sep97,mm   changed "if.h" to "net/if.h", added stdio.h, unistd.h, 
                  and sockLib.h
 01a,08Feb94,ms   cleaned and modified for VxDemo.
 */
 
 #include "vxWorks.h"
 #include "types.h"
 #include "string.h"
 #include "socket.h"
 #include "sockLib.h"
 #include "stdio.h"
 #include "in.h"
 #include "net/if.h"
 #include "ioctl.h"
 #include "unistd.h"
 
 #define BUFSIZ (sizeof (struct ifreq) * 4)/*size of buffer for SIOCFGIFCONFIG*/
 
 /*****************************************************************************
  * broadcastGet - Get the broadcast message 
  *
  * DESCRIPTION
  *
  *     Demo for getting the broadcast message. Also demonstrates the usage
  *     of SIOCGIFCONF ioctl option. This SIOCGIFCONF ioctl option is not needed
  *     for broadcasting.  
  *
  * RETURNS: OK or ERROR
  *
  * EXAMPLE:
  *
  *     Run broadcastGet task on one VxWorks system as follows
  *     before starting the broadcastSend task from another VxWorks system
  *     in the same physical network. The other half of the demonstration
  *     is in broadcastSend.c.
  *
  *     -> sp (broadcastGet,  7001) 
  *
  *     where 7001 (port number should be greater than 5000 for user-developed)
  *     is an example port number used in this demonstration to receive the
  *     broadcast message.
  *    
  *
  */
 
 STATUS broadcastGet(int port);
 
 STATUS broadcastGet 
     (
     int port                                          /* port number */      
     )
     {
     int sockFd;                   /* socket fd */                   
     struct sockaddr_in sockAddr;  /* socket address to recv from */ 
     char  buf[BUFSIZ];           /* buffer space to hold SIOCGIFCONFIG option*/
     char message[50];             /* buffer for broadcast message */
     int   recvNum;                /* number of bytes received */ 
     struct ifconf ifc;           
     struct ifreq  *ifr;
 
     /* open UDP socket */
     sockFd = socket (AF_INET, SOCK_DGRAM, 0);
     if (sockFd == ERROR)
    	{ 
 	perror ("socket not opened \n");
 	return (ERROR);
 	}
 
     /* Demonstrates the usage of SIOCGIFCONF ioctl option. 
      * This SIOCGIFCONF ioctl option is not really needed for broadcasting.  
      *
      * Following code segment demonstrates the use of SIOCGIFCONF ioctl option.
      * Here SIOCGIFCONF option is used to obtain the name of the network
      * interface. This code segment is not required for receiving broadcasting 
      * message.
      */
 
     ifc.ifc_len = sizeof (buf); 
     ifc.ifc_buf = buf;
     if (ioctl (sockFd, SIOCGIFCONF, (char *)&ifc) == ERROR) 
 	{
 	perror ("broadcast: ioctl (get interface configuration)");
      	return (ERROR);
         }
 
     ifr = ifc.ifc_req;
     /* Print the name of the underlying network interface using SIOCGIFCONF
      * ioctl option.
      */
     printf ("SIOCGIFCONF: This socket uses the network interface %s\n\n", 
              ifr->ifr_name);
 
         
 
     /* Zero out and  fill in sockaddr_in structure to receive from*/
     bzero ((char *) &sockAddr, sizeof (struct sockaddr_in));
     sockAddr.sin_family = AF_INET;
     sockAddr.sin_port = htons (port);
     sockAddr.sin_addr.s_addr = INADDR_ANY; 
 
     /* bind to the socket */ 
     if (bind (sockFd, (struct sockaddr *)& sockAddr, sizeof (sockAddr)) == ERROR)
 	{
 	perror ("bind failed");
 	return (ERROR);
 	}
 
     FOREVER
         /* receive the broadcast message */
         if ((recvNum = recv (sockFd, message, sizeof (message), 0)) == ERROR)
             {
             perror("recv broadcast failed ");
             break;
 	    }
         else
             printf ("received %d bytes of broadcast message:  %s\n", recvNum, message);
     close (sockFd);
     }