From f9f1b64dfdf284fd04b4719f205e181992e16887 Mon Sep 17 00:00:00 2001 From: ingenzi <vany.ingenzi@student.uclouvain.be> Date: Fri, 18 Mar 2022 10:49:36 +0100 Subject: [PATCH] Modified utils and added the code for the inginious task --- headers/our_utils.h | 6 +- headers/receiver.h | 23 +++- headers/receiver_utils.h | 26 ---- receiver | Bin 0 -> 28000 bytes sender | Bin 0 -> 23528 bytes src/our_utils.c | 16 +-- src/receiver.c | 2 +- src/receiver_utils.c | 5 +- temp/get_ipv6_address.c | 253 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 288 insertions(+), 43 deletions(-) delete mode 100644 headers/receiver_utils.h create mode 100755 receiver create mode 100755 sender create mode 100644 temp/get_ipv6_address.c diff --git a/headers/our_utils.h b/headers/our_utils.h index 8647c5c..421c0da 100644 --- a/headers/our_utils.h +++ b/headers/our_utils.h @@ -44,11 +44,11 @@ int create_socket(struct sockaddr_in6 *source_addr, int src_port, struct sockadd /* Block the caller until a message is received on sfd, * and connect the socket to the source addresse of the received message * @sfd: a file descriptor to a bound socket but not yet connected - * @buffer : a non null buffer where it writes the received message. - * @len: after reading the message it sents the amount bytes read in len. * @return: 0 in case of success, -1 otherwise + * @POST: This call is idempotent, it does not 'consume' the data of the message, + * and could be repeated several times blocking only at the first call. */ -int wait_for_client(int sfd, int MAX_MESSAGE_SIZE, char * buffer, ssize_t * len); +int wait_for_client(int sfd); #endif \ No newline at end of file diff --git a/headers/receiver.h b/headers/receiver.h index c1fcb39..7bdbfea 100644 --- a/headers/receiver.h +++ b/headers/receiver.h @@ -1,4 +1,25 @@ /** * @file receiver.h * @brief This header contains all the structures and functions definitions that ae going to be used by the receiver.c - */ \ No newline at end of file + */ + +#ifndef __RECEIVER_UTILS_ +#define __RECEIVER_UTILS_ + +/* We are using 8 bits to encode the seqnum therefore to fight redondance our window is of 2**(8)/2 */ +#define MAX_SELECTIVE_REPEAT_WINDOW 8 + +/* Represent the receiver's connection state */ +typedef struct __attribute__((__packed__)) +{ +} con_state_t; + + +/** + * Loop reading on socket and printing to the stdout + * @sfd : The socket file descriptor. It is both bound and connected. + * @return: as soon as the whole transfer is done. + */ +void receiver_read_write_loop(int sfd); + +#endif \ No newline at end of file diff --git a/headers/receiver_utils.h b/headers/receiver_utils.h deleted file mode 100644 index 572e45a..0000000 --- a/headers/receiver_utils.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @file receiver_utils.h - * @brief This header contains utils will be used by the receiver - * @date 2022-03-17 - */ - -#ifndef __RECEIVER_UTILS_ -#define __RECEIVER_UTILS_ - -/* We are using 8 bits to encode the seqnum therefore to fight redondance our window is of 2**(8)/2 */ -#define MAX_SELECTIVE_REPEAT_WINDOW 8 - -/* Represent the receiver's connection state */ -typedef struct __attribute__((__packed__)) -{ -} con_state_t; - - -/** - * Loop reading on socket and printing to the stdout - * @sfd : The socket file descriptor. It is both bound and connected. - * @return: as soon as the whole transfer is done. - */ -void receiver_read_write_loop(int sfd); - -#endif \ No newline at end of file diff --git a/receiver b/receiver new file mode 100755 index 0000000000000000000000000000000000000000..719d1d48efb0681ed0c3ffc65d75b512bda1a658 GIT binary patch literal 28000 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 O^JyHH6bTeXrGEwN#d|ma literal 0 HcmV?d00001 diff --git a/sender b/sender new file mode 100755 index 0000000000000000000000000000000000000000..d9d0d784c392e7d8abde67d555244cfa9bef5cc1 GIT binary patch literal 23528 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 RHIe+ZPMzZllYl8J{TB}5SCjw% literal 0 HcmV?d00001 diff --git a/src/our_utils.c b/src/our_utils.c index 0628f01..c07a716 100644 --- a/src/our_utils.c +++ b/src/our_utils.c @@ -89,22 +89,18 @@ int create_socket(struct sockaddr_in6 *source_addr, int src_port, struct sockadd return -1; } - -int wait_for_client(int sfd, int MAX_MESSAGE_SIZE, char * buffer, ssize_t * len) +int wait_for_client(int sfd) { + int MAX_MESSAGE_SIZE = 1024; + uint8_t buff[MAX_MESSAGE_SIZE]; // allocate the receive buffer on the stack struct sockaddr_storage peer_addr; // allocate the peer's address on the stack. It will be initialized when we receive a message socklen_t peer_addr_len = sizeof(struct sockaddr_storage); // variable that will contain the length of the peer's address - *len = recvfrom(sfd, buffer, MAX_MESSAGE_SIZE, MSG_PEEK, (struct sockaddr *) &peer_addr, &peer_addr_len); - if (*len == -1) - { - ERROR("On recvfrom while waiting for client"); + ssize_t amount_read = recvfrom(sfd, buff, MAX_MESSAGE_SIZE, MSG_PEEK, (struct sockaddr *) &peer_addr, &peer_addr_len); + if (amount_read == -1){ return -1; } - int err = connect(sfd, (struct sockaddr *) &peer_addr, sizeof(struct sockaddr_storage)); + int err = connect(sfd, (struct sockaddr *) &peer_addr, sizeof(struct sockaddr_storage)); if (err != EISCONN && err != 0) - { - ERROR("When connecting to client"); return -1; - } return 0; } \ No newline at end of file diff --git a/src/receiver.c b/src/receiver.c index 9afa977..ef5a129 100644 --- a/src/receiver.c +++ b/src/receiver.c @@ -13,7 +13,7 @@ #include "log.h" #include "packet_interface.h" #include "our_utils.h" -#include "receiver_utils.h" +#include "receiver.h" int print_usage(char *prog_name) { ERROR("Usage:\n\t%s [-s stats_filename] listen_ip listen_port", prog_name); diff --git a/src/receiver_utils.c b/src/receiver_utils.c index 9722c55..fdb3e22 100644 --- a/src/receiver_utils.c +++ b/src/receiver_utils.c @@ -3,7 +3,7 @@ #include "packet_interface.h" #include <poll.h> #include "our_utils.h" -#include "receiver_utils.h" +#include "receiver.h" int send_data_if_inneed() { @@ -74,7 +74,7 @@ int connect_to_a_client(int sfd, pkt_t * init_pkt) char * buffer[PKT_MAX_LEN]; ssize_t written_in_buffer; // We suppose that the first contact is going to be our client no need to check for more - int err = wait_for_client(sfd, PKT_MAX_LEN, (char *)buffer, &written_in_buffer); + int err = wait_for_client(sfd); if (err != 0) return -1; DEBUG_DUMP(buffer, written_in_buffer); @@ -105,6 +105,7 @@ void receiver_read_write_loop(int sfd) int err = connect_to_a_client(sfd, pkt); if (err == 0) return; + // Handle initial packet. err = fwrite((void *) pkt_get_payload(pkt), sizeof(char), pkt_get_length(pkt), stdout); diff --git a/temp/get_ipv6_address.c b/temp/get_ipv6_address.c new file mode 100644 index 0000000..d7f3880 --- /dev/null +++ b/temp/get_ipv6_address.c @@ -0,0 +1,253 @@ +#include <arpa/inet.h> +#include <errno.h> +#include <fcntl.h> +#include <netdb.h> +#include <netinet/in.h> +#include <poll.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <unistd.h> + +/*************************** Utilities ******************************/ + + +/*************************** Start Q1 *******************************/ +/* Resolve the resource name to an usable IPv6 address + * @address: The name to resolve + * @rval: Where the resulting IPv6 address descriptor should be stored + * @return: NULL if it succeeded, or a pointer towards + * a string describing the error if any. + * (const char* means the caller cannot modify or free the return value, + * so do not use malloc!) + */ +const char * real_address(const char *address, struct sockaddr_in6 *rval) +{ + struct addrinfo hints; + struct addrinfo *result; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = AI_CANONNAME; + hints.ai_protocol = 0; + int res = getaddrinfo(address, NULL, &hints, &result); + if ( res != 0 ) + return gai_strerror(res); + rval = (struct sockaddr_in6 *) memcpy( (void *) rval, result->ai_addr, sizeof(struct sockaddr_in6)); + freeaddrinfo(result); + return NULL; +} +/*************************** End Q1 *******************************/ + +/*************************** Start Q2 *****************************/ +void ipv6_to_str_unexpanded(char *str, const struct in6_addr *addr) { + sprintf(str, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", + (int)addr->s6_addr[0], (int)addr->s6_addr[1], + (int)addr->s6_addr[2], (int)addr->s6_addr[3], + (int)addr->s6_addr[4], (int)addr->s6_addr[5], + (int)addr->s6_addr[6], (int)addr->s6_addr[7], + (int)addr->s6_addr[8], (int)addr->s6_addr[9], + (int)addr->s6_addr[10], (int)addr->s6_addr[11], + (int)addr->s6_addr[12], (int)addr->s6_addr[13], + (int)addr->s6_addr[14], (int)addr->s6_addr[15]); +} + +int create_socket_bind(struct sockaddr_in6 * source_addr) +{ + // TODO: Create a IPv6 socket supporting datagrams + int sock = socket(AF_INET6, SOCK_DGRAM, 0); + // TODO: Bind it to the source + int err = bind(sock, (struct sockaddr *) source_addr, sizeof(struct sockaddr_in6)); + if (err == -1) + return -1; + + char text[100]; + ipv6_to_str_unexpanded(text, &(source_addr->sin6_addr)); + //const char * addr_str = inet_ntop(AF_INET6, (void *) &(source_addr->sin6_addr), text, 100); + fprintf(stderr, "Successfully bound to IPv6 address : %s, port : %d\n", text, ntohs(source_addr->sin6_port)); + return sock; +} + +int create_socket_connect(struct sockaddr_in6 * dest_addr) +{ + int sock = socket(AF_INET6, SOCK_DGRAM, 0); + int err = connect(sock, (struct sockaddr *) dest_addr, sizeof(*dest_addr)); + if (err == -1) + return -1; + char text[100]; + ipv6_to_str_unexpanded(text, &(dest_addr->sin6_addr)); + fprintf(stderr, "Successfully connected to IPv6 addresss: %s, port : %d\n", text, ntohs(dest_addr->sin6_port)); + return sock; +} + +/* Creates a socket and initialize it + * @source_addr: if !NULL, the source address that should be bound to this socket + * @src_port: if >0, the port on which the socket is listening + * @dest_addr: if !NULL, the destination address to which the socket should send data + * @dst_port: if >0, the destination port to which the socket should be connected + * @return: a file descriptor number representing the socket, + * or -1 in case of error (explanation will be printed on stderr) + */ +int create_socket(struct sockaddr_in6 *source_addr, int src_port, struct sockaddr_in6 *dest_addr, int dst_port) +{ + if ( source_addr != NULL && dest_addr == NULL ) + { + source_addr->sin6_port = htons(src_port); + return create_socket_bind(source_addr); + } else if ( source_addr == NULL && dest_addr != NULL ){ + dest_addr->sin6_port = htons(dst_port); + return create_socket_connect(dest_addr); + } + return -1; +} +/*************************** End Q2 *******************************/ + +/*************************** Start Q3 *****************************/ + +int handle_event(struct pollfd * pfd, ssize_t MAX_SIZE, char * buff) +{ + if (pfd->revents & POLLIN){ + ssize_t read_bytes = read(pfd->fd, (void *) buff, MAX_SIZE); + if (read_bytes == -1) + return 0; + size_t err = fwrite("Incoming : \n\t", sizeof(char), 14, stderr); + err = fflush(stderr); + err = fwrite((void *) buff, sizeof(char), read_bytes, stdout); + if (err == 0) + fprintf(stderr, "Nonesense\n"); + err = fflush(stdout); + return 1; + } else if (pfd->events & POLLHUP){ /*EOF or Error*/ + fprintf(stderr, "Error...\n"); + return 0; + } else { /* POLLOUT */ + size_t err; + size_t read_bytes = fread(buff, sizeof(char), MAX_SIZE, stdin); + if (read_bytes != 0) + { + err = write(pfd->fd, (void *) buff, read_bytes); + if (err == 0) + return 0; + err = fwrite("\n Sent\n", sizeof(char), 8, stderr); + } + err = fflush(stderr); + return 1; + } +} + +/* Loop reading a socket and printing to stdout, + * while reading stdin and writing to the socket + * @sfd: The socket file descriptor. It is both bound and connected. + * @return: as soon as stdin signals EOF + */ +void read_write_loop(int sfd) +{ + struct pollfd * pfds; + pfds = (struct pollfd *) calloc(2, sizeof(struct pollfd)); + if (pfds == NULL) + return; + pfds[0].fd = sfd; + pfds[0].events = POLLIN | POLLOUT; + + pfds[1].fd = 0; // stdin is defined to be file descriptor 0 + pfds[1].events = POLLIN ; + + int nb_open_fds = 2; + int MAX_SIZE = 1024; // Bytes + char buff[MAX_SIZE]; + size_t writen; + while (nb_open_fds > 1) + { + int ready = poll(pfds, 2, -1); + if (ready == -1) + return; + + if (pfds[0].revents & POLLIN){ + ssize_t read_bytes = read(pfds[0].fd, (void *) buff, MAX_SIZE); + if (read_bytes == -1) + return; + writen = fwrite((void *) buff, sizeof(char), read_bytes, stdout); + writen = fflush(stdout); + } else if ((pfds[0].revents & POLLHUP) || (pfds[0].revents & POLLERR)){ + nb_open_fds--; + } else if ((pfds[0].revents & POLLOUT) && (pfds[1].revents & POLLIN)){ + size_t read_bytes = fread(buff, sizeof(char), 1, stdin); + writen = fflush(stdin); + writen = write(pfds[0].fd, (void *) buff, read_bytes); + size_t e = -1; + if (writen == e || feof(stdin) != 0) + return; + } + } +} +/*************************** End Q3 *******************************/ + +/*************************** Start Q4 *****************************/ + +/* Block the caller until a message is received on sfd, + * and connect the socket to the source addresse of the received message + * @sfd: a file descriptor to a bound socket but not yet connected + * @return: 0 in case of success, -1 otherwise + * @POST: This call is idempotent, it does not 'consume' the data of the message, + * and could be repeated several times blocking only at the first call. + */ +int wait_for_client(int sfd) +{ + int MAX_MESSAGE_SIZE = 1024; + uint8_t buff[MAX_MESSAGE_SIZE]; // allocate the receive buffer on the stack + struct sockaddr_storage peer_addr; // allocate the peer's address on the stack. It will be initialized when we receive a message + socklen_t peer_addr_len = sizeof(struct sockaddr_storage); // variable that will contain the length of the peer's address + ssize_t amount_read = recvfrom(sfd, buff, MAX_MESSAGE_SIZE, MSG_PEEK, (struct sockaddr *) &peer_addr, &peer_addr_len); + if (amount_read == -1){ + return -1; + } + int err = connect(sfd, (struct sockaddr *) &peer_addr, sizeof(struct sockaddr_storage)); + if (err != EISCONN && err != 0) + return -1; + return 0; +} + +/*************************** End Q4 *******************************/ + +int main(int argc, char const *argv[]) +{ + if (argc != 4) + { + fprintf(stderr, "./get_ipv6_addr <name_to_resolve> <port> <flag>\n - <flag> ::= c `|` s\n"); + return (EXIT_SUCCESS); + } + + // Name resolving + struct sockaddr_in6 * addr = (struct sockaddr_in6 *) malloc(sizeof(struct sockaddr_in6)); + const char * res = real_address(argv[1], addr); + if (res != NULL) + { + fprintf(stderr, "An error occured when name resolving :\n\t%s\n", res); + return (EXIT_FAILURE); + } + + // Socket Binding or Connecting + int socket; + if (strncasecmp(argv[3], "c", 1) == 0) + { + socket = create_socket(NULL, 0, addr, atoi(argv[2])); + } else if (strncasecmp(argv[3], "s", 1) == 0) + { + socket = create_socket(addr, atoi(argv[2]), NULL, 0); + wait_for_client(socket); + } + if (socket == -1) + { + fprintf(stderr, "An error occured when connecting/binding to address\n"); + return (EXIT_FAILURE); + } + + read_write_loop(socket); + + close(socket); + // Writing and reading + return (EXIT_SUCCESS ); +} \ No newline at end of file -- GitLab