From 1130ecd0865eb865c2e5840f1bfb7f4b7123dbef Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 31 May 2015 13:09:45 +0200 Subject: [PATCH] renamed some files --- session4/{ => select}/Makefile | 0 session4/{ => select}/httpd.c | 0 session4/{ => select}/readline.c | 0 session4/{ => select}/readline.h | 0 session4/{ => select}/www | 0 session4/udp_signal/Makefile | 11 +++++ session4/udp_signal/client.c | 65 ++++++++++++++++++++++++++++ session4/udp_signal/server.c | 74 ++++++++++++++++++++++++++++++++ 8 files changed, 150 insertions(+) rename session4/{ => select}/Makefile (100%) rename session4/{ => select}/httpd.c (100%) rename session4/{ => select}/readline.c (100%) rename session4/{ => select}/readline.h (100%) rename session4/{ => select}/www (100%) create mode 100644 session4/udp_signal/Makefile create mode 100644 session4/udp_signal/client.c create mode 100644 session4/udp_signal/server.c diff --git a/session4/Makefile b/session4/select/Makefile similarity index 100% rename from session4/Makefile rename to session4/select/Makefile diff --git a/session4/httpd.c b/session4/select/httpd.c similarity index 100% rename from session4/httpd.c rename to session4/select/httpd.c diff --git a/session4/readline.c b/session4/select/readline.c similarity index 100% rename from session4/readline.c rename to session4/select/readline.c diff --git a/session4/readline.h b/session4/select/readline.h similarity index 100% rename from session4/readline.h rename to session4/select/readline.h diff --git a/session4/www b/session4/select/www similarity index 100% rename from session4/www rename to session4/select/www diff --git a/session4/udp_signal/Makefile b/session4/udp_signal/Makefile new file mode 100644 index 0000000..76432db --- /dev/null +++ b/session4/udp_signal/Makefile @@ -0,0 +1,11 @@ +TARGETS = server client + +CC = gcc +CFLAGS = -g + +all: $(TARGETS) Makefile +clean: + rm -f $(TARGETS) + rm -f *.o *~ + +.PHONY: all clean diff --git a/session4/udp_signal/client.c b/session4/udp_signal/client.c new file mode 100644 index 0000000..5604832 --- /dev/null +++ b/session4/udp_signal/client.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include + +#include +#include +#include + + +void handle_error(char *msg) +{ + fprintf(stderr, "%s: %s\n", msg, strerror(errno)); + + exit(EXIT_FAILURE); +} + + +int main(int argc, char *argv[]) +{ + int fd; + char *lineptr = NULL; + size_t linelen = 0; + + struct sockaddr_in sa = { .sin_family = AF_INET }; + + if (argc != 3) { + printf("usage: %s DEST-IP PORT\n", argv[0]); + exit(-1); + } + + if (!inet_aton(argv[1], &sa.sin_addr)) + fprintf(stderr, "Failed to parse destination IP address\n"); + + sa.sin_port = atoi(argv[2]); + if (!sa.sin_port) + fprintf(stderr, "Failed to parse port number"); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + handle_error("Failed to create socket"); + + if (connect(fd, (struct sockaddr *) &sa, sizeof(sa))) + handle_error("Failed to connect socket"); + + while (!feof(stdin)) { + size_t len = getline(&lineptr, &linelen, stdin); + if (len > 0) { + if (send(fd, lineptr, len+1, 0) == -1) + handle_error("Failed to send"); + + if (recv(fd, lineptr, linelen, 0) == -1) + handle_error("Failed to recv"); + + fprintf(stdout, "%s", lineptr); + } + } + + if (close(fd)) + handle_error("Failed to close socket"); + + free(lineptr); + + return 0; +} diff --git a/session4/udp_signal/server.c b/session4/udp_signal/server.c new file mode 100644 index 0000000..f4a60c1 --- /dev/null +++ b/session4/udp_signal/server.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +static int fd; + +void echo(int sig) +{ + char line[1024]; + + struct sockaddr_in sa = { .sin_family = AF_INET }; + socklen_t salen = sizeof(sa); + + ssize_t msglen = recvfrom(fd, &line, sizeof(line), 0, (struct sockaddr *) &sa, &salen); + if (msglen == -1) + error(-1, errno, "Failed to recv"); + + if (sendto(fd, &line, msglen, 0, + (struct sockaddr *) &sa, salen) == -1) + error(-1, errno, "Failed to send"); +} + +void quit() +{ + if (close(fd)) + error(-1, errno, "Failed to close socket"); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + error(-1, 0, "Usage: %s PORT\n", argv[0]); + + struct sockaddr_in sa = { .sin_family = AF_INET }; + + sa.sin_port = atoi(argv[1]); + if (!sa.sin_port) + fprintf(stderr, "Failed to parse port number"); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + error(-1, errno, "Failed to create socket"); + + if (bind(fd, (struct sockaddr *) &sa, sizeof(sa))) + error(-1, errno, "Failed to bind socket"); + + if (fcntl(fd, F_SETOWN, getpid())) + error(-1, errno, "Failed fcntl"); + + if (fcntl(fd, F_SETFL, O_ASYNC, 1)) + error(-1, errno, "Failed fcntl"); + + atexit(quit); + + struct sigaction sig = { + .sa_handler = echo, + .sa_flags = 0 + }; + sigemptyset(&sig.sa_mask); + + if (sigaction(SIGIO, &sig, NULL)) + error(-1, errno, "sigaction"); + + while(1); + + return 0; +} \ No newline at end of file