diff options
Diffstat (limited to 'Semestr 4/sieci/pracownia3')
-rw-r--r-- | Semestr 4/sieci/pracownia3/config.h | 10 | ||||
-rw-r--r-- | Semestr 4/sieci/pracownia3/p3.pdf | bin | 95110 -> 0 bytes | |||
-rw-r--r-- | Semestr 4/sieci/pracownia3/transport.c | 149 | ||||
-rw-r--r-- | Semestr 4/sieci/pracownia3/utils.c | 58 | ||||
-rw-r--r-- | Semestr 4/sieci/pracownia3/utils.h | 18 | ||||
-rw-r--r-- | Semestr 4/sieci/pracownia3/window.c | 42 | ||||
-rw-r--r-- | Semestr 4/sieci/pracownia3/window.h | 24 |
7 files changed, 0 insertions, 301 deletions
diff --git a/Semestr 4/sieci/pracownia3/config.h b/Semestr 4/sieci/pracownia3/config.h deleted file mode 100644 index 3b81646..0000000 --- a/Semestr 4/sieci/pracownia3/config.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H - -#define DATAGRAM_LEN 1000 -#define HEADER_LEN 40 - -#define WINDOW_SIZE 3000 -#define TIMEOUT 100 - -#endif diff --git a/Semestr 4/sieci/pracownia3/p3.pdf b/Semestr 4/sieci/pracownia3/p3.pdf Binary files differdeleted file mode 100644 index 14f1261..0000000 --- a/Semestr 4/sieci/pracownia3/p3.pdf +++ /dev/null diff --git a/Semestr 4/sieci/pracownia3/transport.c b/Semestr 4/sieci/pracownia3/transport.c deleted file mode 100644 index 9226d69..0000000 --- a/Semestr 4/sieci/pracownia3/transport.c +++ /dev/null @@ -1,149 +0,0 @@ -/* Projekt: Transport - * Autor: Franciszek Malinka 316093 - */ - -#include <netinet/ip.h> -#include <arpa/inet.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <stdbool.h> -#include "config.h" -#include "window.h" -#include "utils.h" - -size_t send_datagram(int sockfd, struct sockaddr_in server_address, char *buffer, size_t buffer_len) { - return sendto(sockfd, buffer, buffer_len, 0, (struct sockaddr*) &server_address, sizeof(server_address)); -} - -void send_data_request(int sockfd, struct sockaddr_in server_address, size_t pos, size_t bytes) { - char buffer[40]; - sprintf(buffer, "GET %ld %ld\n", pos, bytes); - size_t buffer_len = strlen(buffer); - if (send_datagram(sockfd, server_address, buffer, buffer_len) != buffer_len) { - fprintf(stderr, "sendto error: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } -} - -size_t recv_message(int sockfd, char *buffer, struct sockaddr_in *sender) { - socklen_t sender_len = sizeof(*sender); - bzero(buffer, HEADER_LEN + DATAGRAM_LEN); - bzero(sender, sizeof(*sender)); - size_t datagram_len = recvfrom(sockfd, buffer, IP_MAXPACKET, 0, - (struct sockaddr*)sender, &sender_len); - - if (datagram_len < 0) { - fprintf(stderr, "recvfrom error: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - - return datagram_len; -} - -void request_data(int sockfd, struct sockaddr_in server_address, window_t *w, size_t bytes_writen, size_t remaining_bytes) { - int pos = w->first_pos; - for (int i = 0; i < w->size && i*DATAGRAM_LEN < remaining_bytes; i++) { - if (w->uptodate[pos] == false) { - size_t bytes_to_request = min(DATAGRAM_LEN, remaining_bytes - i*DATAGRAM_LEN); - send_data_request(sockfd, server_address, bytes_writen + i*DATAGRAM_LEN, bytes_to_request); - } - pos = (pos + 1) % w->size; - } -} - -void update_file(FILE *fd, window_t *w, size_t *bytes_writen, size_t *remaining_bytes) { - while (w->uptodate[w->first_pos] && *remaining_bytes > 0) { - // printf("Writing %ld\n", *bytes_writen); - size_t bytes_to_write = min(DATAGRAM_LEN, *remaining_bytes); - fwrite(w->ar[w->first_pos], sizeof(char), bytes_to_write, fd); - *bytes_writen += bytes_to_write; - *remaining_bytes -= bytes_to_write; - shift(w); - } -} - -size_t recv_datagram(int sockfd, char *buffer, struct sockaddr_in server_address) { - struct sockaddr_in sender; - - size_t received_bytes = recv_message(sockfd, buffer, &sender); - if (sender.sin_addr.s_addr != server_address.sin_addr.s_addr || sender.sin_port != server_address.sin_port) { - printf("Smieci!\n"); - return 0; - } - return received_bytes; -} - - -void receive_file(int sockfd, struct sockaddr_in server_address, const char *file_name, size_t remaining_bytes) { - FILE *fd = fopen(file_name, "w"); - if (!fd) { - fprintf(stderr, "fopen error: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - size_t bytes_writen = 0; - - size_t recv_pos, recv_len; - char buffer[DATAGRAM_LEN + HEADER_LEN]; - int prev_len = 0; - window_t w; - init_window(&w, WINDOW_SIZE, DATAGRAM_LEN); - - while (remaining_bytes) { - request_data(sockfd, server_address, &w, bytes_writen, remaining_bytes); - int timeout = TIMEOUT; - while (poll_socket_modify_timeout(sockfd, &timeout)) { - size_t received_bytes = recv_datagram(sockfd, buffer, server_address); - if (received_bytes == 0) continue; - sscanf(buffer, "DATA %ld %ld\n", &recv_pos, &recv_len); - if (recv_pos < bytes_writen) continue; - - int pos = (recv_pos - bytes_writen) / DATAGRAM_LEN; - pos = (pos + w.first_pos) % w.size; - if (!w.uptodate[pos]) { - for (int i = 0; i < recv_len; i++) { - w.ar[pos][i] = buffer[i + received_bytes - recv_len]; - } - w.uptodate[pos] = true; - } - update_file(fd, &w, &bytes_writen, &remaining_bytes); - } - - if (prev_len != bytes_writen) { - prev_len = bytes_writen; - printf("%.3f%%\n", 100.0 * (float)(bytes_writen) / (float)(remaining_bytes+bytes_writen)); - } - } - destroy_window(&w); - fclose(fd); -} - -int main(int argc, char *argv[]) { - if (argc != 5) { - printf("Usage:\n\t%s [server ip] [server port] [output file name] [file size]\n", argv[0]); - return -1; - } - - int sockfd = get_socket(); - struct sockaddr_in server_address; - bzero(&server_address, sizeof(server_address)); - server_address.sin_family = AF_INET; - if (!inet_pton(AF_INET, argv[1], &server_address.sin_addr)) { - fprintf(stderr, "Invalid ip address: %s\n", argv[1]); - return -1; - } - server_address.sin_port = htons(atoi(argv[2])); - if (server_address.sin_port == 0) { - fprintf(stderr, "Invalid port: %s\n", argv[2]); - return -1; - } - - size_t file_len = atoi(argv[4]); - if (file_len == 0) { - printf("File len is 0, nothing to do here.\n"); - return 0; - } - - receive_file(sockfd, server_address, argv[3], file_len); -}
\ No newline at end of file diff --git a/Semestr 4/sieci/pracownia3/utils.c b/Semestr 4/sieci/pracownia3/utils.c deleted file mode 100644 index 4c2f449..0000000 --- a/Semestr 4/sieci/pracownia3/utils.c +++ /dev/null @@ -1,58 +0,0 @@ -/* Projekt: Transport - * Autor: Franciszek Malinka 316093 - */ - -#include "utils.h" -#include <poll.h> -#include <errno.h> -#include <stdio.h> -#include <netinet/ip.h> -#include <arpa/inet.h> -#include <stdlib.h> -#include <string.h> - -size_t min(size_t x, size_t y) { return (x<y ? x : y); } - -int get_socket() { - int sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd < 0) { - fprintf(stderr, "socket error: %s", strerror(errno)); - exit(EXIT_FAILURE); - } - return sockfd; -} - -long get_time_interval(struct timespec start, struct timespec finish) { - return S_TO_MS(finish.tv_sec - start.tv_sec) + NS_TO_MS(finish.tv_nsec - start.tv_nsec); -} - -int poll_socket_modify_timeout(int sockfd, int *timeout) { - if (*timeout < 0) { - *timeout = 0; - return 0; - } - - struct pollfd fds; - struct timespec start; - struct timespec finish; - - fds.fd = sockfd; - fds.events = POLLIN; - fds.revents = 0; - - clock_gettime(CLOCK_REALTIME, &start); - int result = poll(&fds, 1, *timeout); - clock_gettime(CLOCK_REALTIME, &finish); - - if (result == -1) { - fprintf(stderr, "poll error: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - if (result == 0) { - *timeout = 0; - return 0; - } - - *timeout -= get_time_interval(start, finish); - return result; -} diff --git a/Semestr 4/sieci/pracownia3/utils.h b/Semestr 4/sieci/pracownia3/utils.h deleted file mode 100644 index eccf347..0000000 --- a/Semestr 4/sieci/pracownia3/utils.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H - -#include <stddef.h> -#include <time.h> - -#define NS_TO_MS(X) ((long)(X) / (long)1000000) -#define S_TO_MS(X) ((long)(X) * (long)1000) - -size_t min(size_t x, size_t y); - -int get_socket(); - -long get_time_interval(struct timespec start, struct timespec finish); - -int poll_socket_modify_timeout(int sockfd, int *timeout); - -#endif
\ No newline at end of file diff --git a/Semestr 4/sieci/pracownia3/window.c b/Semestr 4/sieci/pracownia3/window.c deleted file mode 100644 index c8bffad..0000000 --- a/Semestr 4/sieci/pracownia3/window.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Projekt: Transport - * Autor: Franciszek Malinka 316093 - */ - -#include "window.h" -#include <stdlib.h> -#include <strings.h> - -void init_window(window_t *w, int window_size, int window_width) { - w->ar = malloc(window_size * sizeof(char *)); - for (int i = 0; i < window_size; i++) - w->ar[i] = malloc(window_width * sizeof(char)); - w->uptodate = malloc(window_size); - bzero (w->uptodate, window_size); - w->first_pos = 0; - w->size = window_size; -} - -void destroy_window(window_t *w) { - for (int i = 0; i < w->size; i++) - free(w->ar[i]); - free(w->ar); - free(w->uptodate); -} - -void shift_while_uptodate(window_t *w) { - while (w->uptodate[w->first_pos]) { - w->uptodate[w->first_pos] = false; - w->first_pos = (w->first_pos + 1) % w->size; - } -} - -void shift(window_t *w) { - w->uptodate[w->first_pos] = false; - w->first_pos = (w->first_pos + 1) % w->size; -} - -void update(window_t *w, int pos, char *buffer, size_t buf_size) { - pos = (w->first_pos + pos) % w->size; - for (int i = 0; i < buf_size; i++) w->ar[pos][i] = buffer[i]; - w->uptodate[pos] = true; -}
\ No newline at end of file diff --git a/Semestr 4/sieci/pracownia3/window.h b/Semestr 4/sieci/pracownia3/window.h deleted file mode 100644 index 63e89cc..0000000 --- a/Semestr 4/sieci/pracownia3/window.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef WINDOW_H -#define WINDOW_H - -#include <stdbool.h> -#include <stddef.h> - -typedef struct { - char **ar; - bool *uptodate; - int size; - int first_pos; -} window_t; - -void init_window(window_t *w, int window_size, int window_width); - -void destroy_window(window_t *w); - -void shift_while_uptodate(window_t *w); - -void shift(window_t *w); - -void update(window_t *w, int pos, char *buffer, size_t buf_size); - -#endif
\ No newline at end of file |