python编程拍照搜题答案软件
Traceroute是一种网络诊断工具,用于跟踪数据包在IP网络上的路径。在Python中,你可以使用socket库来实现Traceroute功能。下面是一个简单的示例代码,演示了如何使用Python编写Traceroute。
```python
import socket
import struct
import sys
import time
ICMP_ECHO_REQUEST = 8
ICMP_CODE = socket.getprotobyname('icmp')
def checksum(source_string):
计算校验和
sum = 0
count_to = (len(source_string) / 2) * 2
count = 0
while count < count_to:
this_val = source_string[count 1] * 256 source_string[count]
sum = sum this_val
sum = sum & 0xffffffff
count = count 2
if count_to < len(source_string):
sum = sum source_string[len(source_string) 1]
sum = sum & 0xffffffff
sum = (sum >> 16) (sum & 0xffff)
sum = sum (sum >> 16)
answer = ~sum
answer = answer & 0xffff
answer = answer >> 8 | (answer << 8 & 0xff00)
return answer
def build_packet():
构建ICMP包
my_checksum = 0
my_id = os.getpid() & 0xFFFF
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, my_id, 1)
bytes_In_double = struct.calcsize("d")
data = (192 bytes_In_double) * "Q"
data = struct.pack("d", time.time()) bytes(data.encode('utf8'))
my_checksum = checksum(header data)
if sys.platform == 'darwin':
my_checksum = socket.htons(my_checksum) & 0xffff
else:
my_checksum = socket.htons(my_checksum)
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, my_id, 1)
packet = header data
return packet
def parse_packet(packet):
解析ICMP包
ttl = struct.unpack("h", packet[36:38])[0]
saddr = ".".join(map(str, struct.unpack("BBBB", packet[42:46])))
length = len(packet)
return ttl, saddr, length
def main(dest_name):
dest_addr = socket.gethostbyname(dest_name)
max_hops = 30
icmp = socket.getprotobyname('icmp')
udp = socket.getprotobyname('udp')
ttl = 1
while True:
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
构建ICMP包
package = build_packet()
发送数据包
send_socket.sendto(package, (dest_name, 33434))
接收数据包
recv_socket.settimeout(5)
try:

data, dummy = recv_socket.recvfrom(1024)
except socket.error:
pass
finally:
recv_socket.close()
send_socket.close()
解析数据包
try:
ttl, saddr, length = parse_packet(data)
except:
pass
print(ttl, saddr, length)
if saddr == dest_addr or ttl > max_hops:
break
ttl = 1
```
在这个示例中,我们使用了Python的socket库来构建ICMP包,并发送、接收数据包。通过不断增加TTL值,我们可以逐步跟踪数据包的路径,直到达到目的地或者超过最大跳数限制。
你可以根据自己的需要对这段代码进行定制,以满足特定的Traceroute需求。
本文 新鼎系統网 原创,转载保留链接!网址:https://acs-product.com/post/25629.html
免责声明:本网站部分内容由用户自行上传,若侵犯了您的权益,请联系我们处理,谢谢!联系QQ:2760375052 版权所有:新鼎系統网沪ICP备2023024866号-15