#include #include #include #include #include #include #include #include "pers.h" #define SERVICE "XDRTEST" /* Name des Services */ #define BUFLEN 2048 /* Pufferlaenge fuer Memory-Stream */ main (argc, argv) int argc; char *argv[]; { int SockDescr; /* Socketdescriptor */ struct sockaddr_in Sock; /* Socket-Adresse */ struct hostent *HostPtr; /* Struktur in /etc/hosts */ struct servent *ServicePtr; /* Struktur in /etc/services */ char *HostName; /* Hostname */ char OBuffer[BUFLEN+1]; /* Sendepuffer */ char IBuffer[BUFLEN+1]; /* Empfangspuffer */ XDR xdrs1; /* XDR-Stream-Handle fuer Senden */ XDR xdrs2; /* XDR-Stream-Handle fuer Empfang */ personal pers1, pers2; /* Personalsaetze */ int NrRead; /* Ueber Socket empfangene Bytes */ int NrWrite; /* Ueber Socket gesendete Bytes */ /* * Aufrufparameter pruefen */ if ( argc != 2 ) { fprintf ( stderr, "Aufruf: %s \n", argv[0] ); exit ( 1 ); } /* * Hostnamen des Partners aus der Argumentenliste uebernehmen * und Socket-Adresse aufbauen */ HostName = argv[1]; if ( ( HostPtr = gethostbyname (HostName) ) == NULL ) { fprintf ( stderr, "%s: Host nicht in /etc/hosts vorhanden\n", HostName ); exit ( 1 ); } memcpy ( (char *) &Sock.sin_addr, (char *) HostPtr->h_addr, HostPtr->h_length ); Sock.sin_family = HostPtr->h_addrtype; if ( ( ServicePtr = getservbyname ( SERVICE, "tcp" ) ) == NULL ) { fprintf ( stderr, "Service nicht in /etc/services\n" ); exit ( 1 ); } Sock.sin_port = ServicePtr->s_port; /* * Socket anlegen */ if ( ( SockDescr = socket ( HostPtr->h_addrtype, SOCK_STREAM, 0 ) ) < 0 ) { perror ("socket"); exit (1); } /* * Verbindung zum Service im angegebenen Host aufbauen */ if ( connect ( SockDescr, &Sock, sizeof (Sock) ) < 0 ) { perror ( "connect" ); exit ( 1 ); } /* * XDR-Stream fuer Sendepuffer eroeffnen */ xdrmem_create (&xdrs1, OBuffer, BUFLEN, XDR_ENCODE); /* * Stammsatz vorbelegen */ pers1.Name = "Peymann"; pers1.Vorname = "Mandana"; pers1.Urlaub = NichtAbgegolten; pers1.Krankheitstage = 3; /* * Kodierung durchfuehren und Daten senden */ if (!xdr_personal (&xdrs1, &pers1)) { fprintf ( stderr, "Fehlerhafte Kodierung\n" ); exit ( 1 ); } NrWrite = write ( SockDescr, OBuffer, xdr_getpos ( &xdrs1 ) ); /* * Daten empfangen; der Server macht nur ein Echo */ while ( ( NrRead = read ( SockDescr, IBuffer, BUFSIZ ) ) > 0 ); /* * XDR-Stream zum Dekodieren eroeffnen */ xdrmem_create (&xdrs2, IBuffer, BUFLEN, XDR_DECODE); /* * Dekodierung durchfuehren */ if (!xdr_personal (&xdrs2, &pers2)) { fprintf ( stderr, "Fehlerhafte Dekodierung\n" ); exit ( 1 ); } /* * Empfangene Daten anzeigen */ printf ( "Empfangener Personalsatz:\n" ); printf ( "pers2.Name: %s\n", pers2.Name ); printf ( "pers2.Vorname: %s\n", pers2.Vorname ); printf ( "pers2.Urlaub: %d\n", pers2.Urlaub ); printf ( "pers2.Krankheitstage: %d\n", pers2.Krankheitstage ); /* * Speicher freigeben */ xdr_free (xdr_personal, &pers2); /* * Socket und XDR-Streams freigeben */ close ( SockDescr ); xdr_destroy ( &xdrs1 ); xdr_destroy ( &xdrs2 ); exit ( 0 ); }