Receiving Data on an ATM Socket PVC Server Example Program

This section describes the procedure for receiving data on an ATM socket PVC server example program.

This program must be compiled with the -D_BSD and -lbsd options. For example, use the cc prog.c -o prog -D_BSD -lbsd command.


/*
 * ATM Sockets PVC Server Example
 *
 * This program opens a PVC an receives data on it.
 *
 */
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/ndd_var.h>
#include <sys/atmsock.h>
#define BUFF_SIZE    8192
char    buff[BUFF_SIZE];
main(argc, argv)
        int argc;
        char *argv[];
{
   int                     s;       // Socket file descriptor
   int                     error;   // Function return code
   sockaddr_ndd_atm_t      addr;    // ATM Socket Address
   // Create a socket in the AF_NDD domain of type SOCK_CONN_DGRAM
   // and NDD_PROT_ATM protocol.
   s = socket(AF_NDD, SOCK_CONN_DGRAM, NDD_PROT_ATM);
   if (s == -1) {          // Socket either returns the file descriptor
      perror("socket");    // or a -1 to indicate an error.
      exit(-1);
   }
   // The bind command associates this socket with a particular
   // ATM device, as specified by addr.sndd_atm_nddname.
   addr.sndd_atm_len = sizeof(addr);
   addr.sndd_atm_family = AF_NDD;
   strcpy( addr.sndd_atm_nddname, "atm0" ); // The name of the ATM device
                                            // which is to be used.
   error = bind( s, (struct sockaddr *)&addr, sizeof(addr) );
   if (error) {         // An error from bind would indicate the
      perror("bind");   // requested ATM device is not available.
      exit(-1);         // Check smitty devices.
   } /* endif */
   // To open a PVC, the addr.sndd_atm_vc_type field of the
   // sockaddr_ndd_atm is set to CONN_PVC.  The VPI and VCI are
   // specified in the fields sndd_atm_addr.number.addr[0] and
   // sndd_atm_addr.number.addr[1].
   addr.sndd_atm_vc_type = CONN_PVC;         // Indicates PVC
   addr.sndd_atm_addr.number.addr[0] = 0;    // VPI
   addr.sndd_atm_addr.number.addr[1] = 15;   // VCI
   error = connect( s, (struct sockaddr *)&addr, sizeof(addr) );
   if (error) {            // A connect error may indicate that
      perror("connect");   // the VPI/VCI is already in use.
      exit(-1);
   } /* endif */
   while (1) {
      error = recv( s, buff, BUFF_SIZE, 0 );
      if (error < 0 ) {                         // Send returns -1 to
         perror("recv");                        // to indicate an error.
         exit(-1);                              // The errno is set an can
      } else {                                  // be displayed with perror.
         printf("received %d bytes\n", error ); // Or it returns the number
      }                                         // of bytes received
   } /* endwhile */
   exit(0);
}