diff --git a/build/api/mictcp_core.o b/build/api/mictcp_core.o index 204edd2..8cc5d68 100644 Binary files a/build/api/mictcp_core.o and b/build/api/mictcp_core.o differ diff --git a/build/client b/build/client index cd85c04..7e893f0 100755 Binary files a/build/client and b/build/client differ diff --git a/build/gateway b/build/gateway index 7e3b76b..15782e3 100755 Binary files a/build/gateway and b/build/gateway differ diff --git a/build/mictcp.o b/build/mictcp.o index d036891..e2f0c5b 100644 Binary files a/build/mictcp.o and b/build/mictcp.o differ diff --git a/build/server b/build/server index 486810f..0b6dfa8 100755 Binary files a/build/server and b/build/server differ diff --git a/log_marche_bien b/log_marche_bien new file mode 100644 index 0000000..e9176db --- /dev/null +++ b/log_marche_bien @@ -0,0 +1,104 @@ +source: +[MIC-TCP] Appel de la fonction: mic_tcp_socket +---------------------------------- +état du socket +Socket File Descriptor: 0 +Socket Protocol State: IDLE +Socket Address IP: +Socket Address Port: 0 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +[TSOCK] Creation du socket MICTCP: OK +------------------------------------------ +creation du pdu SYN: +ACK Flag: 0 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 0 +Destination Port: 1234 +Sequence Number: 0 +Acknowledgment Number: 4294967295 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +---------------------------------- +envoi du pdu SYN vers l'adresse : +IP Address: 127.0.0.1 +Port: 1234 +---------------------------------- +puit: +[MIC-TCP] Appel de la fonction: mic_tcp_socket +---------------------------------- +état du socket +Socket File Descriptor: 0 +Socket Protocol State: IDLE +Socket Address IP: +Socket Address Port: 0 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +[TSOCK] Creation du socket MICTCP: OK +[MIC-TCP] Appel de la fonction: mic_tcp_bind +---------------------------------- + +Socket File Descriptor: 0 +Socket Protocol State: WAITING +Socket Address IP: +Socket Address Port: 1234 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +[TSOCK] Bind du socket MICTCP: OK +[MIC-TCP] Appel de la fonction: mic_tcp_accept +[MICTCP-CORE] Demarrage du thread de reception reseau... +---------------------------------- +état du socket en attendant l'établissement de connection +Socket File Descriptor: 0 +Socket Protocol State: ACCEPTING +Socket Address IP: +Socket Address Port: 1234 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +je vais recv +j'ai recv +------------------------------------------ +pdu reçu +ACK Flag: 0 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 0 +Destination Port: 1234 +Sequence Number: 0 +Acknowledgment Number: 4294967295 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +[MIC-TCP] Appel de la fonction: process_syn_pdu +------------------------------------------ +Construction du Pdu SYN ACK : + +ACK Flag: 1 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 1234 +Destination Port: 0 +Sequence Number: 0 +Acknowledgment Number: 0 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +---------------------------------- +Envoi du PDU SYN ACK à l'adresse: +IP Address: localhost +Port: 0 +---------------------------------- \ No newline at end of file diff --git a/log_marche_pas b/log_marche_pas new file mode 100644 index 0000000..e09ec74 --- /dev/null +++ b/log_marche_pas @@ -0,0 +1,104 @@ +source: +[MIC-TCP] Appel de la fonction: mic_tcp_socket +---------------------------------- +état du socket +Socket File Descriptor: 0 +Socket Protocol State: IDLE +Socket Address IP: +Socket Address Port: 0 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +[TSOCK] Creation du socket MICTCP: OK +------------------------------------------ +creation du pdu SYN: +ACK Flag: 0 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 0 +Destination Port: 1234 +Sequence Number: 0 +Acknowledgment Number: 4294967295 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +---------------------------------- +envoi du pdu SYN vers l'adresse : +IP Address: 127.0.0.1 +Port: 1234 +---------------------------------- +puit +[MIC-TCP] Appel de la fonction: mic_tcp_socket +---------------------------------- +état du socket +Socket File Descriptor: 0 +Socket Protocol State: IDLE +Socket Address IP: +Socket Address Port: 0 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +[TSOCK] Creation du socket MICTCP: OK +[MIC-TCP] Appel de la fonction: mic_tcp_bind +---------------------------------- + +Socket File Descriptor: 0 +Socket Protocol State: WAITING +Socket Address IP: +Socket Address Port: 1234 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +[MICTCP-CORE] Demarrage du thread de reception reseau... +---------------------------------- +[TSOCK] Bind du socket MICTCP: OK +[MIC-TCP] Appel de la fonction: mic_tcp_accept +---------------------------------- +état du socket en attendant l'établissement de connection +Socket File Descriptor: 0 +Socket Protocol State: ACCEPTING +Socket Address IP: +Socket Address Port: 1234 +Remote Address IP: +Remote Address Port: 0 +Local Sequence Number: 0 +Remote Sequence Number: 0 +---------------------------------- +je vais recv +j'ai recv +------------------------------------------ +pdu reçu +ACK Flag: 0 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 0 +Destination Port: 1234 +Sequence Number: 0 +Acknowledgment Number: 4294967295 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +[MIC-TCP] Appel de la fonction: process_syn_pdu +------------------------------------------ +Construction du Pdu SYN ACK : + +ACK Flag: 1 +FIN Flag: 0 +SYN Flag: 1 +Source Port: 1234 +Destination Port: 0 +Sequence Number: 0 +Acknowledgment Number: 0 +Payload Size: 0 +Payload Data is NULL +---------------------------------- +---------------------------------- +Envoi du PDU SYN ACK à l'adresse: +IP Address: localhost +Port: 0 +---------------------------------- diff --git a/src/api/mictcp_core.c b/src/api/mictcp_core.c index 2ef40a9..604828d 100644 --- a/src/api/mictcp_core.c +++ b/src/api/mictcp_core.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -13,7 +14,7 @@ int initialized = -1; int sys_socket; pthread_t listen_th; pthread_mutex_t lock; -unsigned short loss_rate = 0; +unsigned short loss_rate = 20; struct sockaddr_in remote_addr; /* This is for the buffer */ @@ -134,12 +135,15 @@ int IP_recv(mic_tcp_pdu* pk, mic_tcp_sock_addr* addr, unsigned long timeout) /* Convert the remainder to microseconds */ tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000; + // printf("values of tv sec and usec : %ld, %ld\n",tv.tv_sec,tv.tv_usec); /* Create a reception buffer */ int buffer_size = API_HD_Size + pk->payload.size; char *buffer = malloc(buffer_size); - - if ((setsockopt(sys_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) >= 0) { + int setsockopt_return_value; + if ((setsockopt_return_value=setsockopt(sys_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) >= 0) { + // printf("debug : %d\n, return value of setsockopt : %d\n",__LINE__,setsockopt_return_value); result = recvfrom(sys_socket, buffer, buffer_size, 0, (struct sockaddr *)&tmp_addr, &tmp_addr_size); + // printf("debug : %d\n",__LINE__); } if (result != -1) { @@ -162,6 +166,7 @@ int IP_recv(mic_tcp_pdu* pk, mic_tcp_sock_addr* addr, unsigned long timeout) /* Free the reception buffer */ free(buffer); + printf("debug : %d\n",__LINE__); return result; } diff --git a/src/mictcp.c b/src/mictcp.c index ee23b85..3598284 100644 --- a/src/mictcp.c +++ b/src/mictcp.c @@ -6,6 +6,7 @@ #define WINDOW_SIZE 10 #define LOSS_ACCEPTABILITY 0 // sur 10 #define ATTENTE_ACK 1 +#define PAYLOAD_SIZE 64 //================================== STRUCTURES ============================= @@ -42,7 +43,7 @@ pthread_t attente_ack_tid; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t end_accept_cond = PTHREAD_COND_INITIALIZER; char debug=1; - +char version=2; //================================== SIGNATURES DES FONCTIONS PRIVEES ============================= int valid_socket(int socket); @@ -122,7 +123,13 @@ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) { tab_sockets[socket].socket.state = ACCEPTING; display_enhanced_socket(tab_sockets[socket], "état du socket en attendant l'établissement de connection"); - while (tab_sockets[socket].socket.state != ESTABLISHED){ //attente jusqu'a l'etablissement de la connexion + if (version<4){ + tab_sockets[socket].socket.state = ESTABLISHED; + tab_sockets[socket].NoSeqDist=0; + tab_sockets[socket].NoSeqLoc=0; + + } + while (tab_sockets[socket].socket.state != ESTABLISHED){ //attente jusqu'a l'etablissement de la connexion 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 @@ -145,6 +152,14 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) { tab_sockets[socket].dist_addr = addr; tab_sockets[socket].NoSeqLoc = 0; + + if (version<4){ + tab_sockets[socket].socket.state = ESTABLISHED; + display_enhanced_socket(tab_sockets[socket], "État du socket aprés l'établissement de la connection :"); + return 0; + } + + tab_sockets[socket].socket.state = SYN_SENT; // create pdu syn mic_tcp_pdu pdu; @@ -231,65 +246,75 @@ int mic_tcp_send(int mic_sock, char *mesg, int mesg_size) if (tab_sockets[mic_sock].socket.state != ESTABLISHED) { - printf("non non non, t’es pas connecté \n"); + printf("l'utilisateur n’es pas connecté \n"); exit(1); } // create pdu mic_tcp_pdu pdu; - 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; + set_mic_tcp_pdu( + &pdu, + tab_sockets[mic_sock].socket.addr.port, + tab_sockets[mic_sock].dist_addr.port, + tab_sockets[mic_sock].NoSeqLoc, + -1, + 0,0,0, + mesg,mesg_size + ); + display_mic_tcp_pdu(pdu, "creation du pdu data:"); - pdu.payload.data = mesg; - pdu.payload.size = mesg_size; + display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "envoi du pdu data vers l'adresse :"); int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); - + printf("Packet envoye\n"); + if (version<2) return sent_size; tab_sockets[mic_sock].socket.state = WAITING; mic_tcp_pdu pdu_r; mic_tcp_sock_addr addr_r; - + pdu_r.payload.size = PAYLOAD_SIZE; while (1) { - if (IP_recv(&pdu_r,&addr_r, timeout) == -1){ + sleep(timeout); + printf("%d\n",__LINE__); + if (IP_recv(&pdu_r,&addr_r, 0) == -1){ + printf("%d\n",__LINE__); sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); - printf("j'envoie un doublon\n"); + printf("%d\n",__LINE__); + printf("Pas de pdu recu, envoi d'un doublon\n"); continue; } - printf("PDU ACK de Data recu \n"); + printf("%d\n",__LINE__); display_mic_tcp_pdu(pdu_r,"pdu reçu :"); if (pdu_r.header.ack == 1 && (tab_sockets[mic_sock].NoSeqLoc == pdu_r.header.ack_num)){ printf("le bon Ack a été reçu\n"); - if(!established){ //stoppe le thread de syn ack quand on est sûrs que la connexion est établie - established = 1; - } tab_sockets[mic_sock].socket.state = ESTABLISHED; - break; + + tab_sockets[mic_sock].NoSeqLoc = ((tab_sockets[mic_sock].NoSeqLoc + 1) % 2); //maj du no de seq uniquement lorsque ACK reçu (= synchronisation du noseq entre puits et src) + display_enhanced_socket(tab_sockets[mic_sock], "État du socket aprés la reception du ack"); + return sent_size; + }else if(pdu_r.header.ack == 1 && pdu_r.header.syn == 1){ printf("PDU SYN ACK recu a nouveau (Doublon) \n"); mic_tcp_pdu pdu_d; - pdu_d.header.source_port = tab_sockets[mic_sock].socket.addr.port; - pdu_d.header.dest_port = tab_sockets[mic_sock].dist_addr.port; - pdu_d.header.seq_num = -1; - pdu_d.header.ack_num = tab_sockets[mic_sock].NoSeqDist; - pdu_d.header.syn = 0; - pdu_d.header.ack = 1; - pdu_d.header.fin = 0; - - pdu_d.payload.size = 0; - pdu_d.payload.data = NULL; + set_mic_tcp_pdu( + &pdu_d, + tab_sockets[mic_sock].socket.addr.port, + tab_sockets[mic_sock].dist_addr.port, + -1, + pdu_r.header.seq_num, + 0,1,0, + NULL,0 + ); + + display_mic_tcp_pdu(pdu_d, "creation du pdu ACK:"); + display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "envoi du pdu ACK vers l'adresse :"); IP_send(pdu_d, tab_sockets[mic_sock].dist_addr); - printf("PDU ACK de connexion renvoyé\n"); - display_mic_tcp_pdu(pdu_d, "Pdu ACK : \n"); + }else { + printf("mauvais pdu reçu\n"); } @@ -299,8 +324,7 @@ int mic_tcp_send(int mic_sock, char *mesg, int mesg_size) // tab_sockets[mic_sock].socket.state = ESTABLISHED; } - tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; //maj du no de seq uniquement lorsque ACK reçu (= synchronisation du noseq entre puits et src) - return sent_size; + } /* @@ -366,9 +390,9 @@ void process_syn_pdu(mic_tcp_pdu pdu,mic_tcp_sock_addr addr, int mic_sock){ args->socket=mic_sock; args->pdu_r=pdu_r; - printf("avant creation thread\n"); + printf("avant creation thread TESA\n"); pthread_create(&attente_ack_tid, NULL,attente_ack,(void *)args); - printf("aprés creation thread\n"); + printf("aprés creation thread TESA\n"); } @@ -387,6 +411,11 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre printf(debug?"socket non trouvé\n":""); } + if (version<2) { + app_buffer_put(pdu.payload); // envoyer la data dans le buffer + printf("data in the buffer\n"); + return; + } if (pdu.header.syn == 1 && tab_sockets[mic_sock].socket.state == ACCEPTING) // si PDU SYN { @@ -412,51 +441,48 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre 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; - pdu_r.header.seq_num = -1; - pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist; - pdu_r.header.syn = 0; - pdu_r.header.ack = 1; - pdu_r.header.fin = 0; - 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"); + mic_tcp_pdu pdu_d; + set_mic_tcp_pdu( + &pdu_d, + tab_sockets[mic_sock].socket.addr.port, + tab_sockets[mic_sock].dist_addr.port, + -1, + pdu.header.seq_num, + 0,1,0, + NULL,0 + ); + + display_mic_tcp_pdu(pdu_d, "creation du pdu ACK:"); + display_mic_tcp_sock_addr(addr, "envoi du pdu ACK vers l'adresse :"); + IP_send(pdu_d, addr); + + + tab_sockets[mic_sock].NoSeqDist = ((tab_sockets[mic_sock].NoSeqDist) + 1) % 2; //update n° seq distant app_buffer_put(pdu.payload); // envoyer la data dans le buffer printf("data in the buffer\n"); } else if(pdu.header.ack == 0 && pdu.header.seq_num != tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED) { // Si Doublon PDU de DATA printf("PDU data recu (Doublon)\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; - pdu_r.header.seq_num = -1; - pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist; - pdu_r.header.syn = 0; - pdu_r.header.ack = 1; - pdu_r.header.fin = 0; - pdu_r.payload.size =0; - 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"); + mic_tcp_pdu pdu_d; + set_mic_tcp_pdu( + &pdu_d, + tab_sockets[mic_sock].socket.addr.port, + tab_sockets[mic_sock].dist_addr.port, + -1, + pdu.header.seq_num, + 0,1,0, + NULL,0 + ); + + display_mic_tcp_pdu(pdu_d, "recreation du pdu ACK:"); - } -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 - printf("PDU ACK de Data recu \n"); - // addValueCircularBuff(&tab_sockets[mic_sock].buffer,1); // PDU bien reçu - //update seq num ? - tab_sockets[mic_sock].socket.state = ESTABLISHED; - } - else{ + display_mic_tcp_sock_addr(addr, "renvoi du pdu ACK vers l'adresse :"); + IP_send(pdu_d, addr); + + + }else{ printf("PDU inattendu recu :\n"); display_enhanced_socket(tab_sockets[mic_sock], "l'état du socket"); @@ -587,6 +613,9 @@ void * attente_ack(void * arg) { { if (tab_sockets[args->socket].socket.state == SYN_RECEIVED) { + + display_mic_tcp_pdu(args->pdu_r, "renvoi du pdu syn ack"); + display_mic_tcp_sock_addr(tab_sockets[args->socket].dist_addr,"a l'adresse"); IP_send(args->pdu_r, tab_sockets[args->socket].dist_addr); printf(debug?"TESA: je renvoie le Syn ack\n":""); }