-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpacket.py
More file actions
57 lines (53 loc) · 2.39 KB
/
packet.py
File metadata and controls
57 lines (53 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# packet.py
import json
import random
class TCPPacket:
"""
این کلاس یک بسته TCP شبیهسازی شده را نشان میدهد.
وظیفه اصلی آن نگهداری اطلاعات هدر و دادهها و همچنین تبدیل این اطلاعات
به فرمت بایتی برای ارسال و برعکس است.
"""
def __init__(self, src_port, dest_port, seq_num, ack_num, syn=0, ack=0, fin=0, rst=0, payload=b''):
# سازنده کلاس بسته
self.src_port = src_port
self.dest_port = dest_port
self.seq_num = seq_num
self.ack_num = ack_num
self.flags = {'SYN': syn, 'ACK': ack, 'FIN': fin, 'RST': rst}
self.payload = payload
self.payload_len = len(payload)
def to_bytes(self):
# این متد شیء بسته را به یک رشته بایتی برای ارسال روی شبکه تبدیل میکند.
header = {
'src_port': self.src_port,
'dest_port': self.dest_port,
'seq_num': self.seq_num,
'ack_num': self.ack_num,
'flags': self.flags,
'payload_len': self.payload_len
}
header_json = json.dumps(header).encode('utf-8')
return header_json + b'|' + self.payload
@staticmethod
def from_bytes(data_bytes):
# این متد استاتیک بایتهای دریافتی را به شیء TCPPacket تبدیل میکند.
header_part, payload = data_bytes.split(b'|', 1)
header = json.loads(header_part.decode('utf-8'))
flags = header['flags']
return TCPPacket(
src_port=header['src_port'],
dest_port=header['dest_port'],
seq_num=header['seq_num'],
ack_num=header['ack_num'],
syn=flags.get('SYN', 0),
ack=flags.get('ACK', 0),
fin=flags.get('FIN', 0),
rst=flags.get('RST', 0),
payload=payload
)
def __repr__(self):
# این متد برای نمایش خواناتر شیء جهت دیباگ کردن استفاده میشود.
active_flags = [flag for flag, active in self.flags.items() if active]
return (f"TCPPacket(src={self.src_port}, dest={self.dest_port}, "
f"seq={self.seq_num}, ack={self.ack_num}, "
f"flags={active_flags}, payload_len={self.payload_len})")