From 0fd2dfdcbb706345ef44797c2e9d92bbfc64b2bf Mon Sep 17 00:00:00 2001 From: Faris Hasim <farishasimsyauqi@gmail.com> Date: Thu, 25 Nov 2021 11:24:44 +0700 Subject: [PATCH] add segment from/to file --- halo.txt | 1 + segment.py | 59 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 halo.txt diff --git a/halo.txt b/halo.txt new file mode 100644 index 0000000..4bb9374 --- /dev/null +++ b/halo.txt @@ -0,0 +1 @@ +ABU ABU CAKUE \ No newline at end of file diff --git a/segment.py b/segment.py index d092bec..a5d966b 100644 --- a/segment.py +++ b/segment.py @@ -1,4 +1,5 @@ import struct +import os # constant SEG_SIZE = 32782 @@ -6,8 +7,14 @@ DATA_SIZE = SEG_SIZE - 12 class Segment(): - def __init__(self): + def __init__(self, seq_no=0, ack_no=0, data=bytes(), checksum=0): + self.DATA_PTR = 12 + self.bytes = [0 for _ in range(SEG_SIZE)] + self.set_seq_no(seq_no) + self.set_ack_no(ack_no) + self.set_data(data) + self.set_checksum(checksum) def set_seq_no(self, val): self.bytes[0] = val >> 24 & 0xff @@ -33,6 +40,20 @@ class Segment(): (self.bytes[6] << 8) + \ self.bytes[7] + def set_data(self, data): + ptr = self.DATA_PTR + for byte in data: + self.bytes[ptr] = byte + ptr += 1 + + def get_data(self): + data=[] + ptr = self.DATA_PTR # pointer to data in segment + while self.bytes[ptr] != 0: + data.append(self.bytes[ptr]) + ptr += 1 + return bytes(data) + def setSYN(self): # raise SYN flag self.bytes[8] = self.bytes[8] | 0b01000000 @@ -73,6 +94,7 @@ class Segment(): len_data += 1 data += struct.pack('!B', 0) + checksum=0 for i in range (0, len_data, 2): w = (data[i] << 8) + (data[i + 1]) checksum += w @@ -91,16 +113,31 @@ class Segment(): self.bytes = list(byte) return self -if __name__=="__main__": - seg = Segment() + def from_file(self, filepath): + filename = os.path.basename(filepath) + with open(filename, 'rb') as f: + self.set_data(f.read()) - seg.setFIN() - seg.set_seq_no() - seg.set_ack_no() - - checksum = seg.count_checksum() - seg.set_checksum(checksum) + def to_file(self, filename): + with open(filename, 'wb') as f: + data = self.get_data() + f.write(data) - seg = Segment(seqno, ackno, flag, data) + def log(self): + print(self.bytes[:50]) - print(seg.bytes[:100]) \ No newline at end of file +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) + + seg = Segment(200, 199) + seg.from_file("halo.txt") + seg.set_checksum(seg.count_checksum()) + seg.log() + + seg.to_file("out.txt") \ No newline at end of file -- GitLab