diff --git a/build/TD2_Rezo.o b/build/TD2_Rezo.o new file mode 100644 index 0000000..17f3df6 Binary files /dev/null and b/build/TD2_Rezo.o differ diff --git a/build/api/mictcp_core.o b/build/api/mictcp_core.o new file mode 100644 index 0000000..7453c0c Binary files /dev/null and b/build/api/mictcp_core.o differ diff --git a/build/apps/client.o b/build/apps/client.o new file mode 100644 index 0000000..c8854f5 Binary files /dev/null and b/build/apps/client.o differ diff --git a/build/apps/gateway.o b/build/apps/gateway.o new file mode 100644 index 0000000..65bfeec Binary files /dev/null and b/build/apps/gateway.o differ diff --git a/build/apps/server.o b/build/apps/server.o new file mode 100644 index 0000000..5a7784c Binary files /dev/null and b/build/apps/server.o differ diff --git a/build/client b/build/client new file mode 100644 index 0000000..e0133ee Binary files /dev/null and b/build/client differ diff --git a/build/gateway b/build/gateway new file mode 100644 index 0000000..1b520c2 Binary files /dev/null and b/build/gateway differ diff --git a/build/mictcp.o b/build/mictcp.o new file mode 100644 index 0000000..0a1ebcb Binary files /dev/null and b/build/mictcp.o differ diff --git a/build/server b/build/server new file mode 100644 index 0000000..414b5d2 Binary files /dev/null and b/build/server differ diff --git a/src/TD2_Rezo.c b/src/TD2_Rezo.c index 7a19cd2..bc50480 100644 --- a/src/TD2_Rezo.c +++ b/src/TD2_Rezo.c @@ -1,113 +1,113 @@ -/* - * Permet de créer un socket entre l’application et MIC-TCP - * Retourne le descripteur du socket ou bien -1 en cas d'erreur - */ -int mic_tcp_socket(start_mode sm) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// /* +// * Permet de créer un socket entre l’application et MIC-TCP +// * Retourne le descripteur du socket ou bien -1 en cas d'erreur +// */ +// int mic_tcp_socket(start_mode sm) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - result = initialize_components(sm); /* Appel obligatoire */ - return -1; } -/* - * Permet d’attribuer une adresse à un socket. - * Retourne 0 si succès, et -1 en cas d’échec - */ -int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - return -1; } -/* - * Met le socket en état d'acceptation de connexion - * Retourne 0 si succès, -1 si erreur - */ -int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - return -1; } -/* - * Permet de réclamer l’établissement d’une connexion - * Retourne 0 si la connexion est établie, et -1 en cas d’échec - */ -int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { -printf("[MIC-TCP] Appel de la fonction: "); -printf(__FUNCTION__); printf("\n"); -return -1; } -/* - * Permet de réclamer l’envoi d’une donnée applicative - * Retourne la taille des données envoyées, et -1 en cas d'erreur - */ -int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// result = initialize_components(sm); /* Appel obligatoire */ +// return -1; } +// /* +// * Permet d’attribuer une adresse à un socket. +// * Retourne 0 si succès, et -1 en cas d’échec +// */ +// int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Met le socket en état d'acceptation de connexion +// * Retourne 0 si succès, -1 si erreur +// */ +// int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Permet de réclamer l’établissement d’une connexion +// * Retourne 0 si la connexion est établie, et -1 en cas d’échec +// */ +// int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Permet de réclamer l’envoi d’une donnée applicative +// * Retourne la taille des données envoyées, et -1 en cas d'erreur +// */ +// int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - int sent_size= -1; - mic_tcp_PDU pdu; - pdu.header = ... - pdu.payload.data = mesg; - pdu.payload.size = mesg_size; +// int sent_size= -1; +// mic_tcp_PDU pdu; +// pdu.header = ... +// pdu.payload.data = mesg; +// pdu.payload.size = mesg_size; - //IP_recv quand fiabilité implémentée +// //IP_recv quand fiabilité implémentée - sent_size = IP_send(pdu, sock_addr) - return sent_size; -} +// sent_size = IP_send(pdu, sock_addr) +// return sent_size; +// } -/* - * Permet à l’application réceptrice de réclamer la récupération d’une donnée - * stockée dans les buffers de réception du socket - * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur - * NB : cette fonction fait appel à la fonction app_buffer_get() - */ -int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// /* +// * Permet à l’application réceptrice de réclamer la récupération d’une donnée +// * stockée dans les buffers de réception du socket +// * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur +// * NB : cette fonction fait appel à la fonction app_buffer_get() +// */ +// int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - int delivered_size = -1; - mic_tcp_payload *payload; - payload.data = mesg; - payload.size = max_mesg_size; - app_buffer_get(payload); +// int delivered_size = -1; +// mic_tcp_payload *payload; +// payload.data = mesg; +// payload.size = max_mesg_size; +// app_buffer_get(payload); - return delivered_size; +// return delivered_size; -} -/* - * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence - * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans - * le buffer de réception du socket. Cette fonction utilise la fonction - * app_buffer_put(). Elle est appelée par initialize_components() - */ -void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// } +// /* +// * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence +// * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans +// * le buffer de réception du socket. Cette fonction utilise la fonction +// * app_buffer_put(). Elle est appelée par initialize_components() +// */ +// void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - //éventuellement trouver les bons socket, buffer et app - app_buffer_put(PDU.body); +// //éventuellement trouver les bons socket, buffer et app +// app_buffer_put(PDU.body); - /* Utile quand on fera du reliable - if(SeqPDU = SeqDist){ //packet valide - SendAck(SeqDist); - SeqDist++; - IP_send(ack); - } - */ +// /* Utile quand on fera du reliable +// if(SeqPDU = SeqDist){ //packet valide +// SendAck(SeqDist); +// SeqDist++; +// IP_send(ack); +// } +// */ -} -/* - * Permet de réclamer la destruction d’un socket. - * Engendre la fermeture de la connexion suivant le modèle de TCP. - * Retourne 0 si tout se passe bien et -1 en cas d'erreur - */ -int mic_tcp_close (int socket) { - printf("[MIC-TCP] Appel de la fonction : "); printf(__FUNCTION__); printf("\n"); - return -1; } +// } +// /* +// * Permet de réclamer la destruction d’un socket. +// * Engendre la fermeture de la connexion suivant le modèle de TCP. +// * Retourne 0 si tout se passe bien et -1 en cas d'erreur +// */ +// int mic_tcp_close (int socket) { +// printf("[MIC-TCP] Appel de la fonction : "); printf(__FUNCTION__); printf("\n"); +// return -1; } -// STRUCTURES +// // STRUCTURES @@ -115,50 +115,50 @@ int mic_tcp_close (int socket) { -/* États du protocole ( noms des états donnés à titre indicatif => peuvent être modifiés) */ -typedef enum protocol_state { -IDLE, CONNECTED, ... -} protocol_state; -/* Mode de démarrage du protocole. NB : nécessaire à l’usage de la fonction initialize_components() */ -typedef enum start_mode { CLIENT, SERVER } start_mode; -/* Structure d’une adresse de socket */ -typedef struct mic_tcp_sock_addr { - char *ip_addr; // @ IP : à fournir sous forme décimale pointée : ex = “192.168.1.2” - int ip_addr_size; // taille de l’adresse - unsigned short port; // numéro de port -} mic_tcp_sock_addr; -/* - * Structure d'un socket - */ -typedef struct mic_tcp_sock { - int fd; /* descripteur du socket */ - protocol_state state; /* état du protocole */ - mic_tcp_sock_addr addr; /* adresse du socket */ -} mic_tcp_sock; -/* - * Structure d'un PDU MIC-TCP - */ -typedef struct mic_tcp_pdu { - mic_tcp_header header ; /* entête du PDU */ - mic_tcp_payload payload; /* charge utile du PDU */ -} mic_tcp_pdu; -/* - * Structure de l'entête d'un PDU MIC-TCP - */ -typedef struct mic_tcp_header -{ - unsigned short source_port; /* numéro de port source */ - unsigned short dest_port; /* numéro de port de destination */ - unsigned int seq_num; /* numéro de séquence */ - unsigned int ack_num; /* numéro d'acquittement */ - unsigned char syn; /* flag SYN (valeur 1 si activé et 0 si non) */ - unsigned char ack; /* flag ACK (valeur 1 si activé et 0 si non) */ - unsigned char fin; /* flag FIN (valeur 1 si activé et 0 si non) */ -} mic_tcp_header; -/* - * Structure des données utiles d’un PDU MIC-TCP - */ -typedef struct mic_tcp_payload { - char* data; /* données applicatives */ - int size; /* taille des données */ -} mic_tcp_payload; +// /* États du protocole ( noms des états donnés à titre indicatif => peuvent être modifiés) */ +// typedef enum protocol_state { +// IDLE, CONNECTED, ... +// } protocol_state; +// /* Mode de démarrage du protocole. NB : nécessaire à l’usage de la fonction initialize_components() */ +// typedef enum start_mode { CLIENT, SERVER } start_mode; +// /* Structure d’une adresse de socket */ +// typedef struct mic_tcp_sock_addr { +// char *ip_addr; // @ IP : à fournir sous forme décimale pointée : ex = “192.168.1.2” +// int ip_addr_size; // taille de l’adresse +// unsigned short port; // numéro de port +// } mic_tcp_sock_addr; +// /* +// * Structure d'un socket +// */ +// typedef struct mic_tcp_sock { +// int fd; /* descripteur du socket */ +// protocol_state state; /* état du protocole */ +// mic_tcp_sock_addr addr; /* adresse du socket */ +// } mic_tcp_sock; +// /* +// * Structure d'un PDU MIC-TCP +// */ +// typedef struct mic_tcp_pdu { +// mic_tcp_header header ; /* entête du PDU */ +// mic_tcp_payload payload; /* charge utile du PDU */ +// } mic_tcp_pdu; +// /* +// * Structure de l'entête d'un PDU MIC-TCP +// */ +// typedef struct mic_tcp_header +// { +// unsigned short source_port; /* numéro de port source */ +// unsigned short dest_port; /* numéro de port de destination */ +// unsigned int seq_num; /* numéro de séquence */ +// unsigned int ack_num; /* numéro d'acquittement */ +// unsigned char syn; /* flag SYN (valeur 1 si activé et 0 si non) */ +// unsigned char ack; /* flag ACK (valeur 1 si activé et 0 si non) */ +// unsigned char fin; /* flag FIN (valeur 1 si activé et 0 si non) */ +// } mic_tcp_header; +// /* +// * Structure des données utiles d’un PDU MIC-TCP +// */ +// typedef struct mic_tcp_payload { +// char* data; /* données applicatives */ +// int size; /* taille des données */ +// } mic_tcp_payload; diff --git a/src/api/mictcp_core.c b/src/api/mictcp_core.c index 0a1136d..b55f36f 100644 --- a/src/api/mictcp_core.c +++ b/src/api/mictcp_core.c @@ -302,9 +302,11 @@ void* listening(void* arg) while(1) - { + { pdu_tmp.payload.size = payload_size; + printf("je vais recv\n"); recv_size = IP_recv(&pdu_tmp, &remote, 0); + printf("j'ai recv\n"); if(recv_size != -1) { diff --git a/src/mictcp.c b/src/mictcp.c index 05c55ee..7c3ba33 100644 --- a/src/mictcp.c +++ b/src/mictcp.c @@ -1,226 +1,431 @@ #include #include #define NBR_SOCKETS 1024 - +#define TIMEOUT_DEFAUT 1 // FONCTIONS - +typedef struct +{ + mic_tcp_sock socket; + mic_tcp_sock_addr dist_addr; + char NoSeqLoc; // = -1; + char NoSeqDist; // = -1; +} enhanced_socket; static int socket_desc = 0; -static mic_tcp_sock tab_sockets[NBR_SOCKETS]; +static enhanced_socket tab_sockets[NBR_SOCKETS]; +int timeout = TIMEOUT_DEFAUT; int valid_socket(int socket); int bound_socket(int socket); - - - +int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2); +void display_mic_tcp_pdu(mic_tcp_pdu pdu, char* prefix); +void display_enhanced_socket(enhanced_socket sock, char* prefix); +void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix); /* * Permet de créer un socket entre l’application et MIC-TCP * Retourne le descripteur du socket ou bien -1 en cas d'erreur */ -int mic_tcp_socket(start_mode sm) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - mic_tcp_sock *socket = &tab_sockets[socket_desc]; - - - socket->fd = socket_desc++; - socket->state = IDLE; - //not bound yet +int mic_tcp_socket(start_mode sm) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + enhanced_socket *socket = &tab_sockets[socket_desc]; - int result = initialize_components(sm); /* Appel obligatoire */ - if (result<0){ - return -1; - } - - return socket->fd; + socket->socket.fd = socket_desc++; + socket->socket.state = IDLE; + // not bound yet + display_enhanced_socket(*socket, "état du socket"); + int result = initialize_components(sm); /* Appel obligatoire */ + if (result < 0) + { + return -1; + } + + return socket->socket.fd; } - /* * Permet d’attribuer une adresse à un socket. * Retourne 0 si succès, et -1 en cas d’échec */ -int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + + if (valid_socket(socket) && tab_sockets[socket].socket.state == IDLE) + { + tab_sockets[socket].socket.addr = addr; + tab_sockets[socket].socket.state = WAITING; + display_enhanced_socket(tab_sockets[socket],""); - - if(valid_socket(socket) && tab_sockets[socket].state ==IDLE){ - tab_sockets[socket].addr = addr; - tab_sockets[socket].state = BOUND; - return 0; } - - return -1; - } + return -1; +} /* * Met le socket en état d'acceptation de connexion * Retourne 0 si succès, -1 si erreur */ -int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); - if(valid_socket(socket) && tab_sockets[socket].state == BOUND){ - tab_sockets[socket].state = ACCEPTING; + if (valid_socket(socket) && tab_sockets[socket].socket.state == WAITING) + { + tab_sockets[socket].socket.state = ACCEPTING; return 0; } - return -1; + return -1; } - /* * Permet de réclamer l’établissement d’une connexion * Retourne 0 si la connexion est établie, et -1 en cas d’échec */ -int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - if(valid_socket(socket) && tab_sockets[socket].state == IDLE){ - printf("%d\n", socket); - tab_sockets[socket].addr = addr; - tab_sockets[socket].state = ESTABLISHED; - return 0; +int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) +{ + // if(!bound_socket(socket)){ + // printf("Socket not bound, cannot connect to specified address\n"); + // exit(1); + // } + tab_sockets[socket].dist_addr = addr; + // tab_sockets[socket].NoSeqDist = 0; + tab_sockets[socket].NoSeqLoc = 0; + // create pdu syn + mic_tcp_pdu pdu; + pdu.header.source_port = tab_sockets[socket].socket.addr.port; + pdu.header.dest_port = tab_sockets[socket].dist_addr.port; + pdu.header.seq_num = tab_sockets[socket].NoSeqLoc; + pdu.header.ack_num = -1; + pdu.header.syn = 1; + pdu.header.ack = 0; + pdu.header.fin = 0; + + + pdu.payload.data = NULL; + pdu.payload.size = 0; + display_enhanced_socket(tab_sockets[socket], "état du socket"); + display_mic_tcp_pdu(pdu, "envoi du pdu :"); + printf("À l'adresse :\n Remote Address IP: %.*s\n", addr.ip_addr_size, addr.ip_addr); + printf("Remote Address Port: %hu\n", addr.port); + + IP_send(pdu, tab_sockets[socket].dist_addr); + while (1) + { + sleep(timeout); + printf("timeout\n"); + if (tab_sockets[socket].socket.state == WAITING) + { + IP_send(pdu, tab_sockets[socket].dist_addr); + } + else if (tab_sockets[socket].socket.state == ESTABLISHED) + { + break; + } } - - return -1; + return 0; } - /* - * Permet de réclamer l’envoi d’une donnée applicative - * Retourne la taille des données envoyées, et -1 en cas d'erreur - */ + * Permet de réclamer l’NULL +*/ +int mic_tcp_send(int mic_sock, char *mesg, int mesg_size) +{ -int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - mic_tcp_sock socket=tab_sockets[mic_sock]; - mic_tcp_header header; - - // printf("%d\n", mic_sock); - if (socket.state!=ESTABLISHED){ - printf("connection not established\n"); - return -1; + if (tab_sockets[mic_sock].socket.state != ESTABLISHED) + { + printf("non non non, t’es pas connecté \n"); + exit(1); } - - header.dest_port=socket.addr.port; - - int sent_size = -1; + // create pdu mic_tcp_pdu pdu; - pdu.header = header; + pdu.header.source_port = tab_sockets[mic_sock].socket.addr.port; + pdu.header.dest_port = tab_sockets[mic_sock].dist_addr.port; + pdu.header.seq_num = tab_sockets[mic_sock].NoSeqLoc; + pdu.header.ack_num = -1; + pdu.header.syn = 0; + pdu.header.ack = 0; + pdu.header.fin = 0; + pdu.payload.data = mesg; pdu.payload.size = mesg_size; - - //IP_recv quand fiabilité implémentée - - sent_size = IP_send(pdu, socket.addr) ; + + IP_send(pdu, tab_sockets[mic_sock].dist_addr); + tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; + + tab_sockets[mic_sock].socket.state = SYN_SENT; + int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); + + while (1) + { + sleep(timeout); + if (tab_sockets[mic_sock].socket.state == SYN) + { + sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); + } + else if (tab_sockets[mic_sock].socket.state == ESTABLISHED) + { + break; + } + } return sent_size; } - /* * Permet à l’application réceptrice de réclamer la récupération d’une donnée * stockée dans les buffers de réception du socket * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur * NB : cette fonction fait appel à la fonction app_buffer_get() */ -int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - if(!valid_socket(socket)){ +int mic_tcp_recv(int socket, char *mesg, int max_mesg_size) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + + if (!valid_socket(socket)) + { return -1; } int delivered_size; - mic_tcp_payload *payload; - payload->data= mesg; + mic_tcp_payload *payload = malloc(sizeof(mic_tcp_payload)); + payload->data = mesg; payload->size = max_mesg_size; + printf("procède au app_buffer_get\n"); delivered_size = app_buffer_get(*payload); - + printf("payload récupéré\n"); return delivered_size; - } - /* * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans * le buffer de réception du socket. Cette fonction utilise la fonction * app_buffer_put(). Elle est appelée par initialize_components() */ -void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - /* - mic_tcp_sock_addr addr_emetteur = addr //pour clarification - //éventuellement trouver les bons socket, buffer et app - for (int iint valid_socket(int socket) =0; i socket_desc-1 || tab_sockets[socket].fd == -1){ - //printf("ah, ton socket il existe pas\n"); +int valid_socket(int socket) +{ + if (socket > socket_desc - 1 || tab_sockets[socket].socket.fd == -1) + { + // printf("ah, ton socket il existe pas\n"); return 0; } return 1; } -int bound_socket(int socket){ - if (tab_sockets[socket].addr.ip_addr_size ==-1){ - //printf("socket not bound\n"); +int bound_socket(int socket) +{ + if (tab_sockets[socket].socket.state == IDLE || tab_sockets[socket].socket.state == CLOSING || tab_sockets[socket].socket.state == CLOSED ) + { + // printf("socket not bound\n"); return 0; } return 1; } +int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2) +{ + if (addr1->port == addr2->port && addr1->ip_addr_size == addr2->ip_addr_size && !memcmp(addr1->ip_addr, addr2->ip_addr, addr1->ip_addr_size)) + { + return 1; + } + return 0; +} + +void display_mic_tcp_pdu(mic_tcp_pdu pdu, char* prefix) { + printf("------------------------------------------\n%s\n", prefix); + printf("Source Port: %hu\n", pdu.header.source_port); + printf("Destination Port: %hu\n", pdu.header.dest_port); + printf("Sequence Number: %u\n", pdu.header.seq_num); + printf("Acknowledgment Number: %u\n", pdu.header.ack_num); + printf("SYN Flag: %d\n", pdu.header.syn); + printf("ACK Flag: %d\n", pdu.header.ack); + printf("FIN Flag: %d\n", pdu.header.fin); + printf("Payload Size: %d\n", pdu.payload.size); + if (pdu.payload.data != NULL) { + printf("Payload Data: %.*s\n", pdu.payload.size, pdu.payload.data); + } else { + printf("Payload Data is NULL\n"); + } + printf("----------------------------------\n"); +} +void display_enhanced_socket(enhanced_socket sock,char* prefix) { + printf("----------------------------------\n"); + printf("%s\n", prefix); + printf("Socket File Descriptor: %d\n", sock.socket.fd); + + const char* protocol_states[] = {"IDLE", "CLOSED", "SYN_SENT", "SYN_RECEIVED", "ESTABLISHED", "CLOSING", "ACCEPTING", "WAITING"}; + + + printf("Socket Protocol State: %s\n", protocol_states[sock.socket.state]); + + printf("Socket Address IP: %.*s\n", sock.socket.addr.ip_addr_size, sock.socket.addr.ip_addr); + printf("Socket Address Port: %hu\n", sock.socket.addr.port); + printf("Remote Address IP: %.*s\n", sock.dist_addr.ip_addr_size, sock.dist_addr.ip_addr); + printf("Remote Address Port: %hu\n", sock.dist_addr.port); + printf("Local Sequence Number: %d\n", sock.NoSeqLoc); + printf("Remote Sequence Number: %d\n", sock.NoSeqDist); + printf("----------------------------------\n"); +} - - +void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix) { + printf("%s\n", prefix); + printf("IP Address: %.*s\n", addr.ip_addr_size, addr.ip_addr); + printf("Port: %hu\n", addr.port); +}