Übung 2
Netzwerkkommunikation, UNIX-Signale, Aufgabe 2
Folien ⨳ Aufgabe (sister) ⨳ API-Doku (sister)
DISCLAIMER: Die Beispiele stehen hier so, wie in der Übung gemeinsam erarbeitet. Der Code lässt sich nicht eins zu eins zur Abgabe kopieren. Der Einfachheit halber ist einiges abgekürzt und es fehlen unter anderem einige Fehlerbehandlungen.
Beispiel: infinite
Ein Programm, dass sich nicht durch Ctrl + C
beenden lässt:
#include <signal.h>
#include <stdio.h>
int main(void) {
struct sigaction action = {
.sa_sigaction = SIG_IGN,
};
sigaction(SIGINT, &action, NULL);
while (1) {
fprintf(stderr, ".");
}
}
Beispiel: convert-server
Netzwerk-Dienst, der Zeichenketten in Groß- bzw. Kleinbuchstaben umwandeln kann (siehe convert).
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
void handle(FILE *rx, FILE *tx) {
char mode = fgetc(rx);
if (mode == EOF) {
if (ferror(rx)) {
perror("fgetc");
} else {
fprintf(stderr, "Please provide parameter\n");
}
return;
} else if (mode != 'u' && mode != 'l') {
fprintf(stderr, "Wrong mode");
return;
}
int c;
while ((c = fgetc(rx)) != EOF) {
if (mode == 'u' && c >= 'a' && c <= 'z') {
c -= ('a' - 'A');
} else if (mode == 'l' && c >= 'A' && c <= 'Z') {
c += ('a' - 'A');
}
fputc(c, tx);
if (ferror(tx)) {
perror("stdin");
}
if (c == '\n') {
fflush(tx);
}
}
if (ferror(rx)) {
perror("stdin");
}
int status = fflush(tx);
if (status == EOF) {
perror("fflush");
}
}
int main(int argc, char *argv[]) {
int error;
int listenSock = socket(AF_INET6, SOCK_STREAM, 0);
struct sockaddr_in6 address = {
.sin6_family = AF_INET6,
.sin6_port = htons(1122),
.sin6_addr = in6addr_any,
};
int flag = 1;
setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
error = bind(listenSock, (struct sockaddr *) &address, sizeof(address));
if (error) { perror("bind"); };
error = listen(listenSock, SOMAXCONN);
if (error) { perror("listen"); };
while (1) {
int clientSock = accept(listenSock, NULL, NULL);
if (clientSock == -1) { perror("accept"); }
FILE *tx = fdopen(clientSock, "w");
int clientSockDup = dup(clientSock);
FILE *rx = fdopen(clientSockDup, "r");
handle(rx, tx);
fclose(rx);
fclose(tx);
}
}