@@ -45,6 +45,7 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
45
45
bool reset_alrm = true;
46
46
state .seq_curr = 1 ;
47
47
48
+
48
49
while (state .seq_curr <=packet_num ){
49
50
gbnhdr * data_packet = malloc (sizeof (* data_packet ));
50
51
data_packet -> type = DATA ;
@@ -84,13 +85,14 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
84
85
85
86
86
87
}
87
- return (-1 );
88
+ return (0 );
88
89
}
89
90
90
91
ssize_t gbn_recv (int sockfd , void * buf , size_t len , int flags ){
91
92
92
93
int retryCount = 1 ;
93
94
int status = 0 ;
95
+ bool is_seq = false;
94
96
95
97
gbnhdr * packet = malloc (sizeof (* packet ));
96
98
gbnhdr * ack_packet = malloc (sizeof (* ack_packet ));
@@ -144,23 +146,26 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
144
146
/* Sender has sent a DATA packet */
145
147
printf ("INFO: DATA received successfully.\n" );
146
148
/* Receiver responds with DATAACK */
149
+ printf ("Packet seqnum : %d State seqnum: %d\n" ,packet -> seqnum ,state .seqnum );
147
150
if (state .seqnum == packet -> seqnum ){
148
151
printf ("INFO: Received DATA packet is in sequence.\n" );
149
152
state .seqnum = packet -> seqnum + 1 ;
150
153
ack_packet -> seqnum = state .seqnum ;
151
- ack_packet -> checksum = 0 ;
154
+ ack_packet -> checksum = 0 ;
155
+ is_seq = true;
152
156
}else {
153
157
printf ("INFO: DATA packet has the incorrect sequence number.\n" );
154
158
ack_packet -> seqnum = state .seqnum ;
155
- ack_packet -> checksum = 0 ;
159
+ ack_packet -> checksum = 0 ;
160
+ is_seq = false;
156
161
}
157
162
/* Sending ACK / duplicate ACK */
158
163
if (sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , state .address , state .socklen ) == -1 ) {
159
164
printf ("ERROR: ACK sending failed.\n" );
160
165
state .state = CLOSED ;
161
166
break ;
162
167
} else {
163
- if (state . seqnum == packet -> seqnum )
168
+ if (is_seq )
164
169
printf ("INFO: ACK sent successfully.\n" );
165
170
else
166
171
printf ("INFO: Duplicate ACK has been sent.\n" );
@@ -309,6 +314,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
309
314
free (ack_packet );
310
315
state .address = server ;
311
316
state .socklen = socklen ;
317
+ state .seqnum = 1 ;
312
318
return SUCCESS ;
313
319
}else {
314
320
printf ("ERROR: ACK send failed.Retrying ...\n" );
@@ -402,7 +408,8 @@ int gbn_accept(int sockfd, struct sockaddr *client, socklen_t *socklen){
402
408
printf ("INFO: ACK received successfully.\n" );
403
409
printf ("INFO: Connection established successfully.\n" );
404
410
state .address = client ;
405
- state .socklen = * socklen ;
411
+ state .socklen = * socklen ;
412
+ state .seqnum = 1 ;
406
413
free (ack_packet );
407
414
return sockfd ;
408
415
}
0 commit comments