diff --git a/client.py b/client.py index 1651d305d5629a36c6ea0d761049488350d39966..4da536f07e2ed58d8f78e5876b00c324a0b29756 100644 --- a/client.py +++ b/client.py @@ -71,6 +71,28 @@ class Client(): def close_con(self): # To-Do + log("!", "Closing Connection ...") + + byte, _ = self.recv() + rcvd = Segment().from_bytes(byte) + if (not rcvd.test_checksum) or (not rcvd.getFIN): + raise ConnectionError + seg = Segment(300, rcvd.get_seq_no()) + seg.setACK() + self.send(seg.to_bytes(), self.DST_ADDR) + log(f"Segment SEQ={rcvd.get_seq_no()}, FIN", "Received, Ack sent") + + seg = Segment(seg.get_seq_no()) + seg.setFIN() + self.send(seg.to_bytes(), self.DST_ADDR) + log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Sent") + + byte, _ = self.recv() + rcvd = Segment().from_bytes(byte) + if (not rcvd.test_checksum) or (not rcvd.getACK) \ + or (not rcvd.get_ack_no != seg.get_seq_no): + raise ConnectionError + log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked") return if __name__=="__main__": diff --git a/server.py b/server.py index 77c105f1de57b225652c0b52baf0a2aae800aa4a..6bf238a80edeafb4729c54852a2b21a9ff6f4ca4 100644 --- a/server.py +++ b/server.py @@ -98,8 +98,30 @@ class Server(): def close_con(self, client_addr): # To-Do - self.socket.close() - log("!", "Connection is closed") + # self.socket.close() + # log("!", "Connection is closed") + log("!", "Closing Connection ...") + + seg = Segment(100) + seg.setFIN() + self.send(seg.to_bytes(), client_addr) + log(f"Segment SEQ={seg.get_seq_no()}, FIN", "") + + byte , _ = self.recv() + rcvd = Segment().from_bytes(byte) + if (not rcvd.test_checksum()) or (not rcvd.getACK()) \ + or (rcvd.get_ack_no() != seg.get_seq_no()): + raise ConnectionError + log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked") + + byte , _ = self.recv() + rcvd = Segment().from_bytes(byte) + if (not rcvd.test_checksum()) or not rcvd.getFIN(): + raise ConnectionError + seg = Segment(seg.get_seq_no()+1, rcvd.get_seq_no()) + seg.setACK() + self.send(seg.to_bytes(), client_addr) + log(f"Segment SEQ={rcvd.get_seq_no()}, FIN", "Received, Ack sent.") return True if __name__=="__main__":