@@ -22,7 +22,7 @@ void handle_alarm(int sig){
22
22
* thus resending all paeckets in the window */
23
23
printf ("RETRY: %d\n" ,state .retry );
24
24
if (state .retry <=5 ){
25
- state .seq_curr = state .seq_base + 1 ;
25
+ state .seq_curr = state .seq_base ;
26
26
state .retry ++ ;
27
27
state .win_size = 1 ;
28
28
state .seq_max = state .seq_base + state .win_size - 1 ;
@@ -32,7 +32,7 @@ void handle_alarm(int sig){
32
32
return ;
33
33
}
34
34
signal (SIGALRM ,handle_alarm );
35
- alarm (3 );
35
+ alarm (1.5 );
36
36
return ;
37
37
}
38
38
@@ -53,11 +53,9 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
53
53
state .seq_curr = 1 ;
54
54
55
55
printf ("PACKET COUNT: %d \n" ,packet_num );
56
- while (state .seq_curr <=packet_num + 1 ){
56
+ while (state .seq_curr <=packet_num ){
57
57
/*install alarm handler*/
58
58
signal (SIGALRM ,handle_alarm );
59
- if (state .seq_curr == N + 1 )state .seq_curr = 1 ;
60
- state .seq_max = state .seq_base + state .win_size - 1 ;
61
59
gbnhdr * data_packet = malloc (sizeof (* data_packet ));
62
60
data_packet -> type = DATA ;
63
61
data_packet -> seqnum = state .seq_curr ;
@@ -66,15 +64,18 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
66
64
67
65
state .seq_curr ++ ;
68
66
if (reset_alrm == true){
69
- alarm (3 );
67
+ alarm (1.5 );
70
68
reset_alrm = false;
71
69
}
72
70
73
71
data_packet -> checksum = checksum (data_packet , sizeof (* data_packet ) / sizeof (uint16_t ));
74
72
printf ("INFO: Checksum of packet: %d\n" ,data_packet -> checksum );
75
73
76
- if (state .seq_curr - 1 == packet_num && len %DATALEN > 0 )
77
- status = maybe_sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
74
+ if (state .seq_curr - 1 == packet_num )
75
+ if (len %DATALEN > 0 )
76
+ status = maybe_sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
77
+ else
78
+ status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
78
79
else if (state .seq_curr - 1 < packet_num )
79
80
status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
80
81
@@ -101,8 +102,8 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
101
102
state .seq_base = packet -> seqnum ;
102
103
reset_alrm = true;
103
104
state .win_size = 2 ;
105
+ break ;
104
106
}
105
- break ;
106
107
}
107
108
}
108
109
}else return (-1 );
@@ -140,7 +141,8 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
140
141
if (state .seqnum == packet -> seqnum ){
141
142
printf ("INFO: Received DATA packet is in sequence.\n" );
142
143
memcpy (buf ,packet -> data ,sizeof (packet -> data ));
143
- state .seqnum = packet -> seqnum + 1 ;
144
+ state .seqnum = packet -> seqnum + 1 ;
145
+ if (state .seqnum == N + 1 )state .seqnum = 1 ;
144
146
ack_packet -> seqnum = state .seqnum ;
145
147
ack_packet -> checksum = 0 ;
146
148
is_seq = true;
0 commit comments