diff --git a/segment.py b/segment.py index 41f9ce033f2e30613e7343a2334b46c8c7c469dc..d092bec3a4b2a69692a6fafc953a48c7a033ee1d 100644 --- a/segment.py +++ b/segment.py @@ -1,3 +1,5 @@ +import struct + # constant SEG_SIZE = 32782 DATA_SIZE = SEG_SIZE - 12 @@ -62,7 +64,21 @@ class Segment(): def count_checksum(self): # To-Do # ... - return 0 + self.bytes[10] = 0 # dangerous + self.bytes[11] = 0 # dangerous + data = self.to_bytes() + + len_data = len(data) # cara akses bagian data saja, karena perlu di rstrip("\x00") + if (len_data % 2 != 0): # kalau panjangnya ganjil, kudu ditambahin 0 di akhir, pakai struct + len_data += 1 + data += struct.pack('!B', 0) + + for i in range (0, len_data, 2): + w = (data[i] << 8) + (data[i + 1]) + checksum += w + checksum = (checksum >> 16) + (checksum & 0xFFFF) + + return checksum def test_checksum(self): # return self.count_checksum == self.get_checksum @@ -79,5 +95,12 @@ if __name__=="__main__": seg = Segment() seg.setFIN() + seg.set_seq_no() + seg.set_ack_no() + + checksum = seg.count_checksum() + seg.set_checksum(checksum) + + seg = Segment(seqno, ackno, flag, data) - print(seg.bytes[:100]) + print(seg.bytes[:100]) \ No newline at end of file