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