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);
}