继上一篇计算校验和校验和,本章通过socket套接字,struct字节打包成二进制,选择返回套接字的文件描述符的结合,实现一个简单的平工具。
# !/usr/bin/python3.6.4 # !编码:utf - 8 __author__=爸烊浮? __date__=' 2018/5/31 22:27” 导入的时间 进口结构 进口套接字 选择导入 导入系统 def chesksum(数据): ”“” 校验 ”“” n=len(数据) m=n % 2 和=0 因为我在范围(0 n - m 2): 和+=(数据[我])+((数据(i + 1)) & lt; & lt;8)#传入数据以每两个字节(十六进制)通过奥德转十进制,第一字节在低位,第二个字节在高位 如果m: 和+=(数据[1]) #将高于16位与低16位相加 ,金额=(总比的在16)+(总和,0 xffff) 和+=(祝辞总和比;16)#如果还有高于16位,将继续与低16位相加 回答=~总和,0 xffff #主机字节序转网络字节序列(参考小端序转大端序) ,答案=答案祝辞的在8 |(回答& lt; & lt;8,0 xff00) 返回答案 “‘ 连接套接字,并将数据发送到套接字 “‘ def raw_socket (dst_addr imcp_packet): rawsocket=socket.socket (socket.AF_INET、socket.SOCK_RAW socket.getprotobyname (icmp)) send_request_ping_time=time.time () #到套接字发送数据 rawsocket.sendto (imcp_packet (dst_addr, 80)) 返回send_request_ping_time rawsocket dst_addr “‘ 要求平 “‘ def request_ping (data_type data_code、data_checksum data_ID, data_Sequence, payload_body): #把字节打包成二进制数据 imcp_packet=struct.pack(在BBHHH32s, data_type、data_code data_checksum, data_ID, data_Sequence, payload_body) icmp_chesksum=chesksum (imcp_packet) #获取校验和 imcp_packet=struct.pack(在BBHHH32s, data_type、data_code icmp_chesksum, data_ID, data_Sequence, payload_body) 返回imcp_packet “‘ 回复平 “‘ def reply_ping (send_request_ping_time rawsocket data_Sequence,超时=2): 而真正的: started_select=time.time () what_ready=选择。选择([rawsocket]、[][],超时) wait_for_time=(time.time () - started_select) 如果what_ready[0]==[]: #超时 返回1 time_received=time.time () received_packet addr=rawsocket.recvfrom (1024) icmpHeader=received_packet [20:28] 类型、代码、校验和packet_id、序列=struct.unpack ( “在BBHHH icmpHeader ) 如果type====0和序列data_Sequence: 返回time_received——send_request_ping_time 超时=超时- wait_for_time 如果超时& lt;=0: 返回1 “‘ 实现平主机/ip “‘ def萍(主持人): data_type=8 # ICMP回应请求 data_code=0 #必须为零 data_checksum=0 #”……值0代替这个领域……” data_ID=0 #标识符 data_Sequence=1 #序列号 payload_body=b 'abcdefghijklmnopqrstuvwabcdefghi ' #数据 dst_addr=socket.gethostbyname(主机)#将主机名转ipv4地址格式,返回以ipv4地址格式的字符串,如果主机名称是ipv4地址,则它将保持不变 打印(“正平在{0}({1})具有32个字节的数据:“.format(主机、dst_addr)) 因为我在范围(0,4): icmp_packet=request_ping (data_type data_code、data_checksum data_ID, data_Sequence + i, payload_body) send_request_ping_time、rawsocket addr=raw_socket (dst_addr icmp_packet) *=reply_ping (send_request_ping_time、rawsocket data_Sequence + i) 如果时间比;0: 打印(“来自{0}的回复:字节=32时间={1}”女士.format (addr, int (* * 1000))) time . sleep (0.7) 其他: 打印(“请求超时”)。 if __name__==癬_main__”: 如果len (sys.argv) & lt;2: sys。退出(“用法:平。py & lt; host>”) 萍(sys.argv [1]) >之前在python。\ Ping_tool。py www.csdn.net 正在Ping www.csdn.net[47.95.164.112]具有32个字节的数据: 来自47.95.164.112的回复:字节=32时间=39 来自47.95.164.112的回复:字节=32时间=40毫秒 来自47.95.164.112的回复:字节=32时间=40毫秒 来自47.95.164.112的回复:字节=32时间=39女士<强>引用:强>
https://docs.python.org/3/library/socket.html
https://docs.python.org/3/library/select.html select.select https://docs.python.org/3/library/struct.html
以上这篇python实现一个简单的平工具方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
python实现一个简单的平工具方法