/* 23Oct23: Erarbeitetes Beispiel für das Verbindenden zu einem * Netzwerk-Server via DNS und TCP/IP. * * Keine Garantie auf Richtigkeit! Stand unverändert aus der * Tafelübung, am besten nichts kopieren sondern selbst schreiben! */ #include #include #include #include #include #include #include /* Einfache Client-Anwendung: Echo (Schicke dem Server alles) */ void process(FILE *rx, FILE *tx) { int c; /* Alternativ zu fflush: setvbuf(tx, NULL, _IONBF, 0); */ while ((c = fgetc(rx)) != EOF){ /* FEHLERBEHANDLUNG */ fputc(c, tx); /* FEHLERBEHANDLUNG */ fflush(tx); /* FEHLERBEHANDLUNG */ } } int main(int argc, char *argv[]) { char *host, *port; if (argc != 3) { return EXIT_FAILURE; } host = argv[1]; port = argv[2]; struct addrinfo hints = { .ai_socktype = SOCK_STREAM, .ai_family = AF_UNSPEC, .ai_flags = AI_ADDRCONFIG, }; struct addrinfo *head, *curr; int sock, copy; getaddrinfo(host, port, &hints, &head); /* FEHLERBEHANDLUNG mit gai_strerror! */ for (curr = head; curr != NULL; curr = curr->ai_next) { sock = socket(curr->ai_family, curr->ai_socktype, curr->ai_protocol); if (sock == -1) { perror("socket"); return EXIT_FAILURE; } if (connect(sock, curr->ai_addr, curr->ai_addrlen) == 0) { break; } } if (curr == NULL) { fprintf(stderr, "No host found\n"); /* FEHLERBEHANDLUNG! */ return EXIT_FAILURE; } /* Create a file pointer */ FILE *rx = fdopen(sock, "r"); /* FEHLERBEHANDLUNG! */ copy = dup(sock); /* FEHLERBEHANDLUNG! */ FILE *tx = fdopen(copy, "w"); /* FEHLERBEHANDLUNG! */ process(rx, tx); fclose(rx); /* FEHLERBEHANDLUNG! */ fclose(tx); /* FEHLERBEHANDLUNG! */ return EXIT_SUCCESS; }