From 685d32641209b2671b154f52046d6bfd63bd9531 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Mon, 8 Jun 2020 13:24:09 +0200 Subject: put und get gehen, jetzt sogar wirklich, glaube ich --- 03_exercise/cli/client | Bin 30912 -> 31152 bytes 03_exercise/cli/client.c | 41 +++++++++++++++++++++++++++-------------- 03_exercise/srv/shell.c | 37 ++++++++++++++++++++++--------------- 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/03_exercise/cli/client b/03_exercise/cli/client index ecaa0d8..56618d6 100755 Binary files a/03_exercise/cli/client and b/03_exercise/cli/client differ diff --git a/03_exercise/cli/client.c b/03_exercise/cli/client.c index f3a4479..9ae6c0a 100644 --- a/03_exercise/cli/client.c +++ b/03_exercise/cli/client.c @@ -19,6 +19,8 @@ #define BREAK 1 #define CONTINUE 2 +char *get_current_dir_name(void); + int server_sock; pid_t pid; @@ -56,39 +58,50 @@ int main() { pid = fork(); - if (pid != 0) { + if (pid == 0) { read_stdin(); } else { read_server_sock(); } close(server_sock); + kill(pid, SIGKILL); + return 0; } void receive_file(int recv_sock, char *path, int size) { - char buffer[512]; + char buffer[BUF_SIZE]; int file_fd; int received; if ((file_fd = open(path, (O_WRONLY | O_CREAT | O_TRUNC), 0644)) == -1) { perror("Open"); } + if (size == 0) { + // just touch + close(file_fd); + return; + } + received = 0; /* Read all data */ while (received < size) { int nread; - if ((nread = read(recv_sock, buffer + received, size - received)) < 0) { - perror("Read"); - //pthread_exit(NULL); - exit(1); + if ((nread = read(recv_sock, buffer, BUF_SIZE)) > 0) { + if (write_all(file_fd, buffer, nread) != nread) { + break; + } + received += nread; } - - received += nread; } - if (write_all(file_fd, buffer, strlen(buffer) + 1) == strlen(buffer) + 1) { - printf("successfully got remote file \"%s\"\n", path); + if (received == size) { + printf("successfully got remote file \"%s/%s\"", get_current_dir_name(), path); + printf("\n"); + } else { + printf("error getting remote file \"%s/%s\"", get_current_dir_name(), path); + printf("\n"); } close(file_fd); @@ -102,7 +115,7 @@ bool check_get(char *buffer) { cmd[3] = 0; if (strcmp(cmd, "< 0) { - printf("Sent %i bytes\n", write_all(server_sock, buffer, strlen(buffer) + 1)); + size_t count; + while ((count = read(file_fd, buffer, sizeof(buffer))) > 0) { + printf("Sent %i bytes\n", write_all(server_sock, buffer, count)); } if (errno) diff --git a/03_exercise/srv/shell.c b/03_exercise/srv/shell.c index 7a90945..cd053b6 100644 --- a/03_exercise/srv/shell.c +++ b/03_exercise/srv/shell.c @@ -33,31 +33,37 @@ int write_all(int target_sock, char *buffer, size_t size) { return sent; } -void receive_file(int sock, char *path, int size) { - char buffer[512]; +void receive_file(int recv_sock, char *path, int size) { + char buffer[BUF_SIZE]; int file_fd; - int nread, received; + int received; + + if ((file_fd = open(path, (O_WRONLY | O_CREAT | O_TRUNC), 0644)) == -1) { perror("Open"); } - if ((file_fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) { perror("Open"); } + if (size == 0) { + // just touch + close(file_fd); + return; + } received = 0; /* Read all data */ while (received < size) { - if ((nread = read(sock, buffer + received, size - received)) < 0) { - perror("Read"); - //pthread_exit(NULL); - exit(1); + int nread; + if ((nread = read(recv_sock, buffer, BUF_SIZE)) > 0) { + if (write_all(file_fd, buffer, nread) != nread) { + break; + } + received += nread; } - - received += nread; } - if (write_all(file_fd, buffer, strlen(buffer) + 1) == strlen(buffer) + 1) { - printf("successfully wrote to remote file \"%s/%s\"", get_current_dir_name(), path); + if (received == size) { + printf("successfully wrote to remote file \"%s/%s\"\n", get_current_dir_name(), path); printf("\n"); } else { - printf("error writing remote file \"%s/%s\"", get_current_dir_name(), path); + printf("error writing remote file \"%s/%s\"\n", get_current_dir_name(), path); printf("\n"); } @@ -96,8 +102,9 @@ void send_file(int client_fd, char *path) { memset(buffer, 0, BUF_SIZE); errno = 0; - while (read(file_fd, buffer, sizeof(buffer)) > 0) { - /*printf("Sent %i bytes\n", */write_all(client_fd, buffer, strlen(buffer) + 1)/*)*/; + size_t count; + while ((count = read(file_fd, buffer, sizeof(buffer))) > 0) { + /*printf("Sent %i bytes\n", */write_all(client_fd, buffer, count)/*)*/; } if (errno) -- cgit v1.2.3-54-g00ecf