/* * client.c - Client-Programm fuer den Parallel-Server * * Blatt 3, Aufgabe 1, Grundlagen der Informatik 2 fuer E-Techniker * SoSe 2002, (c) Jan Bredereke * * Der Client stellt eine Socket-Verbindung zum Server her und sendet * anschliessend alle Tastatureingaben direkt an den Server. Ende * mit Strng-C. * * Parameter: Host und Port des Servers. * * $Id: client.c,v 1.8 2002/07/04 09:04:01 brederek Exp $ */ #include #include #include #include #define BUF_SIZE 100 int main(int argc, char **argv) { int sock; int port; struct hostent* hostInfo; char *hostAddr; struct sockaddr_in serverAddr; int retCode; char puffer[BUF_SIZE]; int numRead; int numWritten; /* Kommandozeile auswerten */ if (argc != 3) { fprintf(stderr, "Aufruf:\nclient \n"); exit(2); } hostInfo = gethostbyname(argv[1]); if (hostInfo == NULL) { fprintf(stderr, "Kann Hostnamen nicht finden!\n"); exit(1); } retCode = sscanf(argv[2], "%d", &port); if (retCode != 1) { printf("Unzulaessige Portnummer!\n"); exit(1); } /* Socket erzeugen */ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("Client kann Socket nicht erzeugen"); exit(1); } /* Socket mit Port verbinden */ memset((void *) &serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); memcpy(&serverAddr.sin_addr, hostInfo->h_addr, hostInfo->h_length); retCode = connect(sock, (struct sockaddr *) &serverAddr, sizeof(serverAddr)); if (retCode != 0) { perror("Client kann Socket nicht mit Port verbinden"); exit(1); } /* Socket ist nun zum Schreiben bereit */ while(1) { /* Kopiere die Standard-Eingabe in den Socket, solange Daten kommen */ numRead = read(0, (void *) &puffer, BUF_SIZE); if (numRead == -1) { /* Wir nehmen an, dass alle Lesefehler "Dateiende" bedeuten. */ close(stdin); close(sock); exit(0); } if(numRead) { numWritten = write(sock, puffer, numRead); if (numWritten != numRead) { perror("Schreibfehler aufgetreten"); exit(1); } } } }