/* asvcrecv.c */ /* Test program for receiving data over an native atm SVC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct timezone dummy = {0,0}; static double tu1; static double tu2; static int frames = 0; static int drops = 0; static int dropcount = 0; char buf[16 * 1024]; void sigintr( int dummy) { printf("Frames recvd = %10d \n", frames); exit(1); } void aip_recv( int s) /* socket handle */ { int rc; int amt = 0; int status; signal(SIGINT, sigintr); status = read(s, buf, sizeof(buf)); while (status > 0) { amt += status; /* write(1, buf, status); */ status = read(s, buf, sizeof(buf)); frames += 1; } printf("Final return code was %d \n", rc); printf("Final errno was %d \n", errno); printf("Receiver complete.. received %d bytes \n", amt); } int main(int argc,char **argv) { int s; int m; int rc; int result; struct atm_qos qos; struct atm_sap sap; struct sockaddr_atmsvc addr, conn; struct sockaddr_atmsvc to_addr; int connlen; int pcr,size; char dir[ATM_ESA_LEN+1]; if (argc < 3) { printf("Usage: asvcrecv this-host-name peak-cell-rate selector\n"); exit(1); } s = socket(PF_ATMSVC, SOCK_DGRAM, ATM_AAL5); if (s < 0) { printf("Socket: \"%s\"",strerror(errno)); exit(-1); } memset(&qos,0,sizeof(qos)); qos.txtp.traffic_class=ATM_CBR; pcr=atoi(argv[2]); qos.txtp.min_pcr=0; qos.txtp.max_pcr=pcr; qos.txtp.max_sdu=8192; qos.txtp.max_cdv=0; qos.aal=ATM_AAL5; qos.rxtp.traffic_class=ATM_NONE; if (setsockopt (s,SOL_ATM,SO_ATMQOS,&qos,sizeof(qos))<0) { printf("Sockopt ATMQOS: \"%s\"",strerror(errno)); close(s); exit(-1); } memset(&sap, 0, sizeof(sap)); sap.blli[0].l2_proto = ATM_L2_ISO8802; sap.blli[0].l3_proto = ATM_L3_NONE; if ((result = setsockopt(s, SOL_ATM, SO_ATMSAP, &sap,sizeof(sap))) < 0) { printf("SockOpt ATMSAP: \"%s\"",strerror(errno)); close(s); exit(-1); } memset(&addr,0,sizeof(addr)); result=text2atm(argv[1], (struct sockaddr *) &addr, sizeof(addr),T2A_SVC|T2A_NAME); addr.sas_family = AF_ATMSVC; if (argc > 3) { char c; c = atoi(argv[3]); addr.sas_addr.prv[19] = c; } else { addr.sas_addr.prv[19] = 5; } result = bind(s, (struct sockaddr *)&addr, sizeof(addr)); if (result < 0) { printf("Bind: \"%s\"",strerror(errno)); close(s); exit(-1); } result = listen(s, 3); if (result < 0) { printf("Listen: \"%s\"",strerror(errno)); close(s); exit(-1); } m = accept(s, (struct sockaddr *)&conn, &connlen); if (m < 0) { printf("Accept: \"%s\"",strerror(errno)); close(s); exit(-1); } #if 1 size=sizeof(addr); result= getpeername(m, (struct sockaddr *)&addr, &size); if (result < 0) { printf("getpeername: \"%s\"",strerror(errno)); close(m); exit(-1); } result = atm2text(dir,(ATM_ESA_LEN + 1), (struct sockaddr *)&addr,A2T_NAME); if (result < 0) { printf("atm2text: \"%s\"",strerror(errno)); printf("Couldn't get remote host name \n"); } else { printf("Connected ok to host \"%s\"\n", dir); } size=sizeof(qos); if ((result = getsockopt(m,SOL_ATM, SO_ATMQOS, &qos, &size)) < 0) { printf("getsockopt: \"%s\"",strerror(errno)); close(s); exit(-1); } printf("Traffic parameters:%d,%d,%d\n", qos.txtp.max_pcr,qos.txtp.min_pcr,qos.txtp.max_sdu); #endif aip_recv(m); }