ICMP协议Ping方法的Python实现解析
说明
流程
- 选择目标网址
- 解析对方ip地址
- 构造数据报,添加校验和,发送并记录发送时间
- 循环监听,直到接收到数据报,提取对方发送时间,获得数据报传输时间;若超时则返回None
细节解析
检查管理员权限
if ctypes.windll.shell32.IsUserAnAdmin() == 0:
print 'Sorry! You should run this with administrative privileges.'
sys.exit()
获取本机IP
my_ID = os.getpid() & 0xFFFF
构造Socket
icmp = socket.getprotobyname('icmp')
my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
构造数据报
data = (192 - byte_in_double) * "P"
data = struct.pack("d", time.clock()) + data
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1)
packet = header + data
计算校验和
checksum = 0
count = (len(source) / 2) * 2
i = 0
while i < count:
temp = ord(source[i + 1]) * 256 + ord(source[i])
checksum = checksum + temp
checksum = checksum & 0xffffffff
i = i + 2
if i < len(source):
checksum = checksum + ord(source[len(source) - 1])
checksum = checksum & 0xffffffff
checksum = (checksum >> 16) + (checksum & 0xffff)
checksum = checksum + (checksum >> 16)
answer = ~checksum
answer = answer & 0xffff
answer = answer >> 8 | (answer << 8 & <