python实现一个简单的平工具方法

  

继上一篇计算校验和校验和,本章通过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实现一个简单的平工具方法