From 651df34c1bf208bc5e95fdbc53e04ce82992dbed Mon Sep 17 00:00:00 2001 From: Barnavon Jules-Ian Date: Wed, 12 Apr 2023 14:33:38 +0200 Subject: [PATCH] mictcp_v2 OK git add .! --- .vscode/settings.json | 3 + build/client | Bin 49864 -> 51552 bytes build/gateway | Bin 62152 -> 63848 bytes build/mictcp.o | Bin 29392 -> 35728 bytes build/server | Bin 49816 -> 51512 bytes src/mictcp.c | 128 ++++++++++++++++++++++++++++++++---------- 6 files changed, 102 insertions(+), 29 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0db5873 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.configureOnOpen": true +} \ No newline at end of file diff --git a/build/client b/build/client index 9bc813408ccb0fbc9373e05372bfd02ac3d6b720..76a2922a587a4d0ca7314a20dfe6df58ec0bd013 100755 GIT binary patch delta 16047 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 pQgxWvSCCz~L#ZBOyg`P-?S9*851p{{apNPl^Bl delta 12997 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 Ic|7%h02bLoZ~y=R diff --git a/build/gateway b/build/gateway index 9b3ccd948db011832e30cf0ddad2e5126696938b..26257e559a827411d8f5b3fc051fb3c802e96dac 100755 GIT binary patch delta 19304 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%0D&zsf@yhdQ!0!Ru0kiP_wi9p*U>cSq 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 delta 16133 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 TUjK4K-~x~6&XCzBm*W2qVN>qZ diff --git a/build/mictcp.o b/build/mictcp.o index 61831c318116d92f7f8d5ea551ae34371c9670ae..1a3d1b3a9d63e02b27d8bf932038258c2ceb03a3 100644 GIT binary patch literal 35728 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 diff --git a/build/server b/build/server index 1f8045f2006adbd8c57eb58bfbe19faa3215d58b..d8d1a347411e6540f4bdb011d4b1a46cff164619 100755 GIT binary patch delta 15766 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 delta 12850 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 diff --git a/src/mictcp.c b/src/mictcp.c index 30c243c..c67a1e1 100644 --- a/src/mictcp.c +++ b/src/mictcp.c @@ -11,9 +11,19 @@ typedef struct char NoSeqDist; // = -1; } enhanced_socket; +typedef struct +{ + int socket; + mic_tcp_pdu pdu_r; +}arg_thread; + + static int socket_desc = 0; static enhanced_socket tab_sockets[NBR_SOCKETS]; int timeout = TIMEOUT_DEFAUT; +pthread_t attente_ack_tid; +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t end_accept_cond = PTHREAD_COND_INITIALIZER; int valid_socket(int socket); int bound_socket(int socket); @@ -21,6 +31,8 @@ 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); +void * attente_ack(void * arg); +void error(char * message, int line); /* * Permet de créer un socket entre l’application et MIC-TCP * Retourne le descripteur du socket ou bien -1 en cas d'erreur @@ -37,6 +49,7 @@ int mic_tcp_socket(start_mode sm) socket->socket.state = IDLE; // not bound yet display_enhanced_socket(*socket, "état du socket"); + socket->NoSeqLoc =0; int result = initialize_components(sm); /* Appel obligatoire */ if (result < 0) { @@ -81,8 +94,15 @@ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) if (valid_socket(socket) && tab_sockets[socket].socket.state == WAITING) { tab_sockets[socket].socket.state = ACCEPTING; + while (tab_sockets[socket].socket.state != ESTABLISHED){ + if(pthread_mutex_lock(&mutex)!= 0){error("erreur lock mutex",__LINE__);} //lock mutex + pthread_cond_wait(&end_accept_cond,&mutex); + if(pthread_mutex_unlock(&mutex)!= 0){error("erreur unlock mutex",__LINE__);} //unlock mutex + } return 0; } + + return -1; } @@ -112,6 +132,7 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) pdu.header.fin = 0; + // tab_sockets[socket].NoSeqLoc = 1; pdu.payload.data = NULL; pdu.payload.size = 0; display_enhanced_socket(tab_sockets[socket], "état du socket"); @@ -123,8 +144,6 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) tab_sockets[socket].socket.state = SYN_SENT; while (1) { - sleep(timeout); - printf("timeout\n"); printf("Socket state : %d, SYN SENT = %d\n",tab_sockets[socket].socket.state,SYN_SENT ); if (tab_sockets[socket].socket.state == SYN_SENT) { @@ -134,6 +153,8 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) { break; } + sleep(timeout); + printf("timeout\n"); } return 0; @@ -225,6 +246,7 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre int mic_sock; display_mic_tcp_pdu(pdu, "pdu reçu"); + printf("display finished \n"); for (mic_sock = 0; (mic_sock < socket_desc) && !(tab_sockets[mic_sock].socket.addr.port==pdu.header.dest_port); mic_sock++) ; // trouver le socket destinataire @@ -239,10 +261,12 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre printf("PDU SYN recu\n"); tab_sockets[mic_sock].socket.state = SYN_RECEIVED; mic_tcp_pdu pdu_r; + + tab_sockets[mic_sock].NoSeqDist = pdu.header.seq_num; tab_sockets[mic_sock].dist_addr = addr; pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port; pdu_r.header.dest_port = tab_sockets[mic_sock].dist_addr.port; - pdu_r.header.seq_num = -1; + pdu_r.header.seq_num = tab_sockets[mic_sock].NoSeqLoc; // NOSEQLOC INITIALISE ? pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist; pdu_r.header.syn = 1; pdu_r.header.ack = 1; @@ -253,33 +277,28 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "à l'adresse:"); IP_send(pdu_r, tab_sockets[mic_sock].dist_addr); - tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; - tab_sockets[mic_sock].NoSeqDist = pdu.header.seq_num; + //tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; //update n° de séquence local tab_sockets[mic_sock].socket.state = SYN_RECEIVED; display_mic_tcp_pdu(pdu_r, "Pdu SYN ACK : \n"); - while (1) - { - printf("PDU SYN ACK envoyé\n"); - sleep(timeout); - if (tab_sockets[mic_sock].socket.state == SYN_RECEIVED) - { - IP_send(pdu, tab_sockets[mic_sock].dist_addr); - } - else if (tab_sockets[mic_sock].socket.state == ESTABLISHED) - { - break; - } - } + arg_thread* args = malloc(sizeof(arg_thread)); + args->socket=mic_sock; + args->pdu_r=pdu_r; + + printf("avant creation thread\n"); + pthread_create(&attente_ack_tid, NULL,attente_ack,(void *)args); + printf("aprés creation thread\n"); + + } else if (pdu.header.ack == 1 && pdu.header.syn == 1 && tab_sockets[mic_sock].socket.state == SYN_SENT) { // si SYN ACK reçu envoyer ACK printf("PDU SYN ACK recu\n"); tab_sockets[mic_sock].socket.state = ESTABLISHED; - tab_sockets[mic_sock].NoSeqDist = pdu.header.seq_num; + tab_sockets[mic_sock].NoSeqDist = pdu.header.seq_num; // récupérer n° de seq du client mic_tcp_pdu pdu_r; pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port; @@ -295,12 +314,16 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre IP_send(pdu_r, tab_sockets[mic_sock].dist_addr); + printf("PDU ACK de connexion envoyé\n"); + display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "à l'adresse:"); + display_mic_tcp_pdu(pdu_r, "Pdu ACK : \n"); + } else if (pdu.header.ack == 1 && pdu.header.syn == 1 && tab_sockets[mic_sock].socket.state == ESTABLISHED) { // si SYN ACK reçu à nouveau renvoyer ACK - printf("PDU SYN ACK recu a nouveau\n"); + printf("PDU SYN ACK recu a nouveau (Doublon) \n"); mic_tcp_pdu pdu_r; pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port; @@ -315,10 +338,14 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre pdu_r.payload.data = NULL; IP_send(pdu_r, tab_sockets[mic_sock].dist_addr); + printf("PDU ACK de connexion renvoyé\n"); + + display_mic_tcp_pdu(pdu_r, "Pdu ACK : \n"); } - else if(pdu.header.ack == 0 && pdu.header.seq_num == tab_sockets[mic_sock].NoSeqLoc && tab_sockets[mic_sock].socket.state == ESTABLISHED){ - printf("PDU dat recu \n"); + else if(pdu.header.ack == 0 && pdu.header.seq_num == tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED) + { // Si PDU de DATA + printf("PDU data recu \n"); mic_tcp_pdu pdu_r; pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port; pdu_r.header.dest_port = tab_sockets[mic_sock].dist_addr.port; @@ -327,17 +354,37 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre pdu_r.header.syn = 0; pdu_r.header.ack = 1; pdu_r.header.fin = 0; - tab_sockets[mic_sock].NoSeqDist = (tab_sockets[mic_sock].NoSeqDist) + 1 % 2; + pdu_r.payload.size =0; + tab_sockets[mic_sock].NoSeqDist = (tab_sockets[mic_sock].NoSeqDist) + 1 % 2; //update n° seq distant + display_mic_tcp_pdu(pdu_r,"pdu ack créé :"); + display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "adresse de destination :"); IP_send(pdu_r, tab_sockets[mic_sock].dist_addr); + printf("pdu ack envoyé\n"); + app_buffer_put(pdu.payload); // envoyer la data dans le buffer printf("data in the buffer\n"); } - else if (pdu.header.ack == 1 && tab_sockets[mic_sock].socket.state == WAITING && (tab_sockets[mic_sock].NoSeqLoc == pdu.header.ack_num)) + else if (pdu.header.ack == 1 && tab_sockets[mic_sock].socket.state == SYN_RECEIVED) + { // Si ACK de connection reçu + + printf("PDU ACK recu \n"); + tab_sockets[mic_sock].socket.state = ESTABLISHED; + if(pthread_mutex_lock(&mutex)!= 0){error("erreur lock mutex",__LINE__);} //lock mutex + pthread_cond_broadcast(&end_accept_cond); // Rendre la main au client une fois le accept terminé + if(pthread_mutex_unlock(&mutex)!= 0){error("erreur unlock mutex",__LINE__);} //unlock mutex + + printf("Connexion établie\n"); + } + else if (pdu.header.ack == 1 && tab_sockets[mic_sock].socket.state == WAITING && (tab_sockets[mic_sock].NoSeqLoc != pdu.header.ack_num)) { // si ACK de bon numéro de séquence passer au n° de seq suivant - tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc) + 1 % 2; + printf("PDU ACK de Data recu \n"); + //tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc) + 1 % 2; tab_sockets[mic_sock].socket.state = ESTABLISHED; } + else if (pdu.header.ack ==0 && pdu.header.syn == 0 && pdu.header.fin ==0){ + display_enhanced_socket(tab_sockets[mic_sock], "l'état du socket"); + } } /* @@ -391,15 +438,16 @@ int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2) void display_mic_tcp_pdu(mic_tcp_pdu pdu, char* prefix) { printf("------------------------------------------\n%s\n", prefix); + printf("ACK Flag: %d\n", pdu.header.ack); + printf("FIN Flag: %d\n", pdu.header.fin); + printf("SYN Flag: %d\n", pdu.header.syn); + 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) { + if (pdu.payload.size != 0) { printf("Payload Data: %.*s\n", pdu.payload.size, pdu.payload.data); } else { printf("Payload Data is NULL\n"); @@ -432,3 +480,25 @@ void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix) { printf("IP Address: %.*s\n", addr.ip_addr_size, addr.ip_addr); printf("Port: %hu\n", addr.port); } + +void * attente_ack(void * arg) { + printf("début thread d'envoi de SYN ACK'\n"); + arg_thread* args = (arg_thread*)arg; + while (1) + { + if (tab_sockets[args->socket].socket.state == SYN_RECEIVED) + { + IP_send(args->pdu_r, tab_sockets[args->socket].dist_addr); + } + else if (tab_sockets[args->socket].socket.state == ESTABLISHED) + { + pthread_exit(NULL); + } + sleep(timeout); + } +} + +void error(char * message, int line){ + printf("%s at line %d\n",message,line); + exit(1); +} \ No newline at end of file