/*******************************************************************************/ /* _________________________________________ */ /* / WARNUNG: Das hier ist keine Vorlage, \ */ /* | oder ein vorbildliches, robustes | */ /* | Programm. Es fehlt jegliche | */ /* | Fehlerbehandlung, und könnten | */ /* | Leichtsinnsfehler enthalten sein, weil | */ /* | es sich genau um den Stand aus der | */ /* | Tafelübung handelt. Die Absicht ist es | */ /* | die Möglichkeit anzubieten, weiter an | */ /* | dem erarbeiteten Programm aus der Übung | */ /* | spielen zu können, ohne alles wieder | */ /* | von vorne schreiben zu müssen. Bitte | */ /* | kopiert also nichts aus dieser Datei in | */ /* \ euren Abgaben. / */ /* ----------------------------------------- */ /* \ / \ //\ */ /* \ |\___/| / \// \\ */ /* /0 0 \__ / // | \ \ */ /* / / \/_/ // | \ \ */ /* @_^_@'/ \/_ // | \ \ */ /* //_^_/ \/_ // | \ \ */ /* ( //) | \/// | \ \ */ /* ( / /) _|_ / ) // | \ _\ */ /* ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-. */ /* (( / / )) ,-{ _ `-.|.-~-. .~ `. */ /* (( // / )) '/\ / ~-. _ .-~ .-~^-. \ */ /* (( /// )) `. { } / \ \ */ /* (( / )) .----~-.\ \-' .~ \ `. \^-. */ /* ///.----..> \ _ -~ `. ^-` ^-_ */ /* ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ */ /* /.-~ */ /*******************************************************************************/ #include #include #include #include #include int main() { int sock = socket(AF_INET6, SOCK_STREAM, 0); struct sockaddr_in6 addr = { .sin6_family = AF_INET6, .sin6_addr = in6addr_any, .sin6_port = htons(25552), }; int flag = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); bind(sock, (struct sockaddr*) &addr, sizeof addr); listen(sock, SOMAXCONN); for (;;) { int cli = accept(sock, NULL, NULL); if (0 == fork()) { /* Hier werden alle FDs zwischen Prozessen gedup't. */ char req[100]; read(cli, req, sizeof req); for (int i = 0; i < 100; i++) { char c = req[i] + 3; write(cli, &c, 1); } close(cli); exit(EXIT_SUCCESS); } } return 0; }