From 2559eaf66c14cc8223a5b3fa536ea3b8d4dcf432 Mon Sep 17 00:00:00 2001 From: fly6516 Date: Mon, 6 Jan 2025 14:28:59 +0800 Subject: [PATCH] fix: fix icmp feature --- .idea/Python-web-communicate.iml | 2 +- main.py | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.idea/Python-web-communicate.iml b/.idea/Python-web-communicate.iml index 8a32af1..b6731d8 100644 --- a/.idea/Python-web-communicate.iml +++ b/.idea/Python-web-communicate.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/main.py b/main.py index 9128c73..10934eb 100644 --- a/main.py +++ b/main.py @@ -6,12 +6,38 @@ import re import time +# 计算校验和 +def calculate_checksum(data): + checksum = 0 + n = len(data) + + # 按 16 位块划分 + for i in range(0, n - 1, 2): + chunk = (data[i] << 8) + data[i + 1] + checksum += chunk + + # 如果长度为奇数,补零 + if n % 2 == 1: + checksum += data[-1] << 8 + + # 将 32 位总和折叠为 16 位 + checksum = (checksum >> 16) + (checksum & 0xFFFF) + checksum += (checksum >> 16) + + # 对总和取反 + return ~checksum & 0xFFFF + + # 构造 ICMP 报文 def construct_icmp(): + # ICMP 报文头部: 类型(8), 代码(0), 校验和(0), 标识符(1), 序列号(1) icmp_header = struct.pack('!BBHHH', 8, 0, 0, 1, 1) - checksum = ~sum(icmp_header) & 0xFFFF + data = b'Ping' + # 计算校验和 + checksum = calculate_checksum(icmp_header + data) + # 填充校验和字段 icmp_header = struct.pack('!BBHHH', 8, 0, checksum, 1, 1) - return icmp_header + return icmp_header + data # 构造 UDP 报文