summaryrefslogtreecommitdiffstats
path: root/03_exercise/srv/server.c
diff options
context:
space:
mode:
authorNiklas Halle <niklas@niklashalle.net>2020-06-08 17:30:18 +0200
committerNiklas Halle <niklas@niklashalle.net>2020-06-08 17:30:18 +0200
commit7ab92ebb3424e904ee78862683eb65fb60d878f6 (patch)
tree0725f1324d605ab4fd0ce4fc85b0d0b3fdd72176 /03_exercise/srv/server.c
parent735c44b9b9b8c3bb476e9d5faee60e27c6907b99 (diff)
downloadbetriebssysteme-7ab92ebb3424e904ee78862683eb65fb60d878f6.tar.gz
betriebssysteme-7ab92ebb3424e904ee78862683eb65fb60d878f6.zip
multiple clients
Diffstat (limited to '03_exercise/srv/server.c')
-rw-r--r--03_exercise/srv/server.c62
1 files changed, 47 insertions, 15 deletions
diff --git a/03_exercise/srv/server.c b/03_exercise/srv/server.c
index 11f7482..67fe21c 100644
--- a/03_exercise/srv/server.c
+++ b/03_exercise/srv/server.c
@@ -9,6 +9,18 @@
#include "shell.h"
+/*
+ * READ ME
+ * What works:
+ * - remote shell, weitesgehend die funktionalität der vorhergehenden aufgabe (damit auch pipes und background,
+ * auch wenn wir das nicht ausführlich getestet haben)
+ * - get und put für dateien
+ * - mehrere clients an einem server
+ * Known bugs:
+ * - das erkennen, wann eine neue prompt geprintet werden muss ist aktuell sehr hacky client-seitig implementiert,
+ * scheitert teilweise - die eingabe geht trzd ganz normal, es wird nur keine prompt angezeigt
+ */
+
#define PORT 9000
#define BUF_SIZE 256
@@ -19,13 +31,13 @@ static inline void die(const char *msg) {
}
int main() {
+ setvbuf(stderr, NULL, _IONBF, 0);
+ setvbuf(stdout, NULL, _IONBF, 0);
+
struct sockaddr_in srv_addr, cli_addr;
- int sockopt = 1;
- socklen_t sad_sz = sizeof(struct sockaddr_in);
- int sfd, cfd;
- /*ssize_t bytes;
- char in_buf[BUF_SIZE];
- char out_buf[BUF_SIZE];*/
+ int sockopt = 1;
+ socklen_t sad_sz = sizeof(struct sockaddr_in);
+ int sfd;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(PORT);
@@ -42,16 +54,36 @@ int main() {
if (listen(sfd, 1) < 0)
die("Could not listen on socket");
- cfd = accept(sfd, (struct sockaddr *) &cli_addr, &sad_sz);
- if (cfd < 0)
- die("Could not accept incoming connection");
-
- printf("srv: connected: %s\n", inet_ntoa(cli_addr.sin_addr));
-
- int status = shell(cfd);
+ while (1) {
+ int cfd, pid;
+ cfd = accept(sfd, (struct sockaddr *) &cli_addr, &sad_sz);
+ if (cfd < 0) {
+ perror("Could not accept incoming connection");
+ break;
+ }
+
+ // fork new process
+ pid = fork();
+ if (pid < 0) {
+ perror("ERROR in new process creation");
+ }
+
+ if (pid == 0) {
+ // child process
+ close(sfd);
+
+ printf("srv: connected: %s\n", inet_ntoa(cli_addr.sin_addr));
+ int status = shell(cfd);
+ fprintf(stdout, "srv: client disconnected: %s (%d)\n", inet_ntoa(cli_addr.sin_addr), status);
+ fflush(stdout);
+ close(cfd);
+ } else {
+ // parent process
+ close(cfd);
+ }
+ }
- close(cfd);
close(sfd);
- return status;
+ return 0;
}