#include #include #include #include #include #include #include #include "pers.h" #define SERVICE "XDRTEST" /* Name des Services */ #define BUFLEN 2048 /* Pufferlaenge fuer Memory-Stream */ #define BACKLOG 5 /* Groesse der listen-Warteschlange */ #define LNG_HOST 32 /* Laenge des Hostnamens */ main (argc, argv) int argc; char *argv[]; { int SockDescr1; /* Socketdescriptor fuer listen */ int SockDescr2; /* Socketdescriptor fuer Verbindung */ struct sockaddr_in Sock1; /* Lokale Socket-Adresse */ struct sockaddr_in Sock2; /* Socket-Adresse des Partners */ int AddrLength; /* Laenge der Socket-Adresse */ struct hostent *HostPtr; /* Struktur in /etc/hosts */ struct servent *ServicePtr; /* Struktur in /etc/services */ char LHost[LNG_HOST+1]; /* Eigener 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; /* Personalsatz */ int Length; /* Laenge der empfangenen Daten */ int NrRead; /* Ueber Socket empfangene Bytes */ int NrWrite; /* Ueber Socket gesendete Bytes */ /* * Information fuer eigenen Host besorgen */ gethostname ( LHost, LNG_HOST ); if ( ( HostPtr = gethostbyname (LHost) ) == NULL ) { fprintf ( stderr, "%s: Host nicht in /etc/hosts vorhanden\n", LHost ); exit ( 1 ); } memcpy ( (char *) &Sock1.sin_addr, (char *) HostPtr->h_addr, HostPtr->h_length ); Sock1.sin_family = HostPtr->h_addrtype; if ( ( ServicePtr = getservbyname ( SERVICE, "tcp" ) ) == NULL ) { fprintf ( stderr, "Service nicht in /etc/services\n" ); exit ( 1 ); } Sock1.sin_port = ServicePtr->s_port; /* * Socket anlegen */ if ( ( SockDescr1 = socket ( HostPtr->h_addrtype, SOCK_STREAM, 0 ) ) < 0 ) { perror ("socket"); exit (1); } /* * Socket an den Service binden */ if ( bind ( SockDescr1, &Sock1, sizeof (Sock1) ) < 0 ) { perror ( "bind" ); exit ( 1 ); } /* * Empfangsbereitschaft fuer ankommende Verbindungsaufbau- * wuensche signalisieren */ listen ( SockDescr1, BACKLOG ); /* * In Endlosschleife die Auftraege der Clients abwickeln */ while ( 1 ) { AddrLength = sizeof ( Sock2 ); if ( ( SockDescr2 = accept( SockDescr1, &Sock2, &AddrLength ) ) < 0 ) { perror ( "accept" ); exit ( 1 ); } if ( ( NrRead = read ( SockDescr2, IBuffer, BUFLEN ) ) <= 0 ) { close ( SockDescr2 ); } else { /* * XDR-Stream zum Dekodieren eroeffnen */ xdrmem_create (&xdrs1, IBuffer, BUFLEN, XDR_DECODE); /* * Dekodierung durchfuehren */ if (!xdr_personal (&xdrs1, &pers1)) { fprintf ( stderr, "Fehlerhafte Dekodierung\n" ); } else { /* * XDR-Stream fuer Sendepuffer oeffnen, Daten wieder kodieren * und an Client zurueckschicken */ xdrmem_create (&xdrs2, OBuffer, BUFLEN, XDR_ENCODE); /* * Kodierung durchfuehren */ if (!xdr_personal (&xdrs2, &pers1)) { fprintf ( stderr, "Fehlerhafte Kodierung\n" ); } else { NrWrite = write ( SockDescr2, OBuffer, xdr_getpos ( &xdrs2 ) ); } /* * Speicher freigeben */ xdr_free (xdr_personal, &pers1); } } /* * XDR-Streams freigeben und Verbindung abbauen */ xdr_destroy ( &xdrs1 ); xdr_destroy ( &xdrs2 ); close ( SockDescr2 ); } /* while */ }