/* TCPECHO ----/--+----- INET --- hostname ----+-- count --- text ---< | | +----- IUCV ---- userid -----+ To run: 1. GLOBAL LOADLIB SCEERUN 2. TCPECHO .... To build: 1. GLOBAL TXTLIB SCEELKED CMSLIB 2. GLOBAL LOADLIB SCEERUN 3. CC tcpecho (sscomm */ #include "tcpecho.h" int main ( int argc, char *argv[]) { int s, rc, socktype, socksize, ch, count, i; char *p; union { struct sockaddr_iucv siucv; struct sockaddr_in sinet; } mySock, hisSock; struct { char userid[8]; int seqno; char text[BUFFER_LEN]; } buffer; struct clientid myClient; struct hostent *hostname; if (argc < 4) { rc = helpme(); exit(rc); } /* Translate socket type to uppercase */ for (ch=0; ch < strlen(argv[1]); ch++) { p = (char *)argv[1]+ch; memset(p,toupper(*p), 1); } if ( strcmp(argv[1],kINET) == 0) socktype = AF_INET; else { if (strcmp(argv[1],kIUCV) == 0) socktype = AF_IUCV; else { printf("Invalid socket type '%s'\a\n", argv[1]); rc = helpme(); exit(rc); } } count = atoi(argv[3]); strcpy(buffer.userid, "________"); strcpy(buffer.text, argv[4]); s = socket(socktype, SOCK_STREAM, 0); exit_if_error(Socket, s); Clear(mySock); Clear(hisSock); switch (socktype) { case AF_IUCV: printf("Using domain AF_IUCV\n"); socksize = sizeof mySock.siucv; mySock.siucv.siucv_family = AF_IUCV; memcpy( mySock.siucv.siucv_name, CLIENT, 8); memset( mySock.siucv.siucv_nodeid, ' ', 8); hisSock.siucv.siucv_family = AF_IUCV; memcpy( hisSock.siucv.siucv_userid, argv[2], strlen(argv[2]) ); for (ch=0; ch < strlen(argv[2]); ch++) toupper(*(hisSock.siucv.siucv_userid+ch)); memcpy( hisSock.siucv.siucv_name, SERVER, 8); memset( hisSock.siucv.siucv_nodeid, ' ', 8); break; case AF_INET: printf("Using domain AF_INET\n"); socksize = sizeof mySock.sinet; mySock.sinet.sin_family = AF_INET; mySock.sinet.sin_addr.s_addr = INADDR_ANY; hisSock.sinet.sin_family = AF_INET; if (isdigit(*argv[2])) hisSock.sinet.sin_addr.s_addr = inet_addr(argv[2]); else { hostname = gethostbyname(argv[2]); if (hostname == NULL) { printf("Host %s not known\a\n",argv[2]); exit(-1); } else { printf("Host %s is %s\n", hostname->h_name, inet_ntoa(*(struct in_addr *)(hostname->h_addr)) ); hisSock.sinet.sin_addr = *(struct in_addr *)(hostname->h_addr); } } hisSock.sinet.sin_port = SERVER_PORT; rc = getclientid( AF_INET, &myClient); exit_if_error(getclientid, rc); memcpy(buffer.userid, myClient.c_name.name, 8); break; default: break; } rc = bind(s, (struct sockaddr *)&mySock, socksize); exit_if_error(bind, rc); rc = connect(s, (struct sockaddr *) &hisSock, socksize); exit_if_error(connect, rc); for (i=1; i <= count; i++) { buffer.seqno = i; rc = send(s, (char *)&buffer, sizeof buffer, 0); exit_if_error(send, rc); } rc = close(s); exit_if_error(close, rc); printf("%d copies of '%s' have been sent to %s\n", count, argv[4], argv[2]); exit(0); } int helpme( void ) { printf( "TCPECHO --/--+-- INET -- hostname --+-- count -- text --<\a\n" " | | \n" " +-- IUCV --- userid ---+ \n" ); return(24); }