亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)PING命令的示例代碼

 更新時(shí)間:2023年01月06日 09:41:32   作者:Small_Teenager  
本文主要介紹了Python實(shí)現(xiàn)PING命令的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、PING簡(jiǎn)介

PING(Packet Internet Grope),也稱因特網(wǎng)包探索器。PING使用ICMP回送(ECHO)請(qǐng)求和回送(ECHO)應(yīng)答報(bào)文,一般用于測(cè)試網(wǎng)絡(luò)連通性,統(tǒng)計(jì)往返時(shí)間、丟包率等。PING UNIX命令格式如下:

ping [ - Rdfnqrv ] [ - c count ] [ - i wait ] [ - l preload ] [ - p pattern ] [ - s packetsize ] host

如果目標(biāo)主機(jī)正在運(yùn)行并連在網(wǎng)絡(luò)上,它就會(huì)對(duì)ICMP ECHO請(qǐng)求報(bào)文進(jìn)行應(yīng)答。每個(gè)ICMP ECHO請(qǐng)求報(bào)文包含一個(gè)IP和ICMP報(bào)文收不,后緊跟一個(gè)timeval結(jié)構(gòu),以及用來(lái)填充這個(gè)報(bào)文的填充字節(jié)。

缺省情況下,PING連續(xù)發(fā)送ICMP ECHO請(qǐng)求報(bào)文,直到收到中斷信號(hào)(Ctrl - C)。PING命令每秒發(fā)送一個(gè)報(bào)文,并且在程序結(jié)束是顯示一個(gè)簡(jiǎn)要總結(jié)。PING命令在程序超時(shí)或接收到中斷信號(hào)時(shí)結(jié)束。host參數(shù)可以是有效的主機(jī)名或IP地址。

報(bào)文結(jié)構(gòu)如下:

二、代碼實(shí)現(xiàn)        

# encoding:utf-8
import time
import struct
import socket
import select
 
 
 
 
def chesksum(data):
    n = len(data)
    m = n % 2
    sum = 0
    for i in range(0, n - m ,2):
        sum += (data[i]) + ((data[i+1]) << 8)#傳入data以每?jī)蓚€(gè)字節(jié)(十六進(jìn)制)通過(guò)ord轉(zhuǎn)十進(jìn)制,第一字節(jié)在低位,第二個(gè)字節(jié)在高位
    if m:
        sum += (data[-1])
    #將高于16位與低16位相加
    sum = (sum >> 16) + (sum & 0xffff)
    sum += (sum >> 16) #如果還有高于16位,將繼續(xù)與低16位相加
    answer = ~sum & 0xffff
    #  主機(jī)字節(jié)序轉(zhuǎn)網(wǎng)絡(luò)字節(jié)序列(參考小端序轉(zhuǎn)大端序)
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer
 
def request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body):
    #  把字節(jié)打包成二進(jìn)制數(shù)據(jù)
    icmp_packet = struct.pack('>BBHHH32s',data_type,data_code,data_checksum,data_ID,data_Sequence,payload_body)
    icmp_chesksum = chesksum(icmp_packet)  #獲取校驗(yàn)和
    #  把校驗(yàn)和傳入,再次打包
    icmp_packet = struct.pack('>BBHHH32s',data_type,data_code,icmp_chesksum,data_ID,data_Sequence,payload_body)
    return icmp_packet
 
 
def raw_socket(dst_addr,icmp_packet):
    '''
       連接套接字,并將數(shù)據(jù)發(fā)送到套接字
    '''
    #實(shí)例化一個(gè)socket對(duì)象,ipv4,原套接字,分配協(xié)議端口
    rawsocket = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.getprotobyname("icmp"))
    #記錄當(dāng)前請(qǐng)求時(shí)間
    send_request_ping_time = time.time()
    #發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)
    rawsocket.sendto(icmp_packet,(dst_addr,80))
    #返回?cái)?shù)據(jù)
    return send_request_ping_time,rawsocket,dst_addr
 
 
def reply_ping(send_request_ping_time,rawsocket,data_Sequence,timeout = 2):
    while True:
        #開(kāi)始時(shí)間
        started_select = time.time()
        #實(shí)例化select對(duì)象,可讀rawsocket,可寫(xiě)為空,可執(zhí)行為空,超時(shí)時(shí)間
        what_ready = select.select([rawsocket], [], [], timeout)
        #等待時(shí)間
        wait_for_time = (time.time() - started_select)
        #沒(méi)有返回可讀的內(nèi)容,判斷超時(shí)
        if what_ready[0] == []:  # Timeout
            return -1
        #記錄接收時(shí)間
        time_received = time.time()
        #設(shè)置接收的包的字節(jié)為1024
        received_packet, addr = rawsocket.recvfrom(1024)
        #獲取接收包的icmp頭
        #print(icmpHeader)
        icmpHeader = received_packet[20:28]
        #反轉(zhuǎn)編碼
        type, code, checksum, packet_id, sequence = struct.unpack(
            ">BBHHH", icmpHeader
        )
 
        if type == 0 and sequence == data_Sequence:
            return time_received - send_request_ping_time
 
        #數(shù)據(jù)包的超時(shí)時(shí)間判斷
        timeout = timeout - wait_for_time
        if timeout <= 0:
            return -1
def dealtime(dst_addr,sumtime,shorttime,longtime,accept,i,time):
    sumtime += time
    print(sumtime)
    if i == 4:
        print("{0}的Ping統(tǒng)計(jì)信息:".format(dst_addr))
        print("數(shù)據(jù)包:已發(fā)送={0},接收={1},丟失={2}({3}%丟失),\n往返行程的估計(jì)時(shí)間(以毫秒為單位):\n\t最短={4}ms,最長(zhǎng)={5}ms,平均={6}ms".format(i+1,accept,i+1-accept,(i+1-accept)/(i+1)*100,shorttime,longtime,sumtime))
def ping(host):
    send, accept, lost = 0, 0, 0
    sumtime, shorttime, longtime, avgtime = 0, 1000, 0, 0
    #TODO icmp數(shù)據(jù)包的構(gòu)建
    data_type = 8 # ICMP Echo Request
    data_code = 0 # must be zero
    data_checksum = 0 # "...with value 0 substituted for this field..."
    data_ID = 0 #Identifier
    data_Sequence = 1 #Sequence number
    payload_body = b'abcdefghijklmnopqrstuvwabcdefghi' #data
 
    # 將主機(jī)名轉(zhuǎn)ipv4地址格式,返回以ipv4地址格式的字符串,如果主機(jī)名稱是ipv4地址,則它將保持不變
    dst_addr = socket.gethostbyname(host)
    print("正在 Ping {0} [{1}] 具有 32 字節(jié)的數(shù)據(jù):".format(host,dst_addr))
    for i in range(0,4):
        send = i + 1
        #請(qǐng)求ping數(shù)據(jù)包的二進(jìn)制轉(zhuǎn)換
        icmp_packet = request_ping(data_type,data_code,data_checksum,data_ID,data_Sequence + i,payload_body)
        #連接套接字,并將數(shù)據(jù)發(fā)送到套接字
        send_request_ping_time,rawsocket,addr = raw_socket(dst_addr,icmp_packet)
        #數(shù)據(jù)包傳輸時(shí)間
        times = reply_ping(send_request_ping_time,rawsocket,data_Sequence + i)
        if times > 0:
            print("來(lái)自 {0} 的回復(fù): 字節(jié)=32 時(shí)間={1}ms".format(addr,int(times*1000)))
 
            accept += 1
            return_time = int(times * 1000)
            sumtime += return_time
            if return_time > longtime:
                longtime = return_time
            if return_time < shorttime:
                shorttime = return_time
            time.sleep(0.7)
        else:
            lost += 1
            print("請(qǐng)求超時(shí)。")
 
        if send == 4:
            print("{0}的Ping統(tǒng)計(jì)信息:".format(dst_addr))
            print("\t數(shù)據(jù)包:已發(fā)送={0},接收={1},丟失={2}({3}%丟失),\n往返行程的估計(jì)時(shí)間(以毫秒為單位):\n\t最短={4}ms,最長(zhǎng)={5}ms,平均={6}ms".format(
                i + 1, accept, i + 1 - accept, (i + 1 - accept) / (i + 1) * 100, shorttime, longtime, sumtime/send))
 
 
 
if __name__ == "__main__":
    i = input("請(qǐng)輸入要ping的主機(jī)或域名\n")
    ping(i)

三、結(jié)果顯示

D:\Miniconda3\python.exe D:/網(wǎng)絡(luò)協(xié)議分析與設(shè)計(jì)/實(shí)驗(yàn)/ping/ping.py
請(qǐng)輸入要ping的主機(jī)或域名
www.baidu.com
正在 Ping www.baidu.com [14.215.177.39] 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=34ms
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=26ms
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=32ms
來(lái)自 14.215.177.39 的回復(fù): 字節(jié)=32 時(shí)間=28ms
14.215.177.39的Ping統(tǒng)計(jì)信息:
    數(shù)據(jù)包:已發(fā)送=4,接收=4,丟失=0(0.0%丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
    最短=26ms,最長(zhǎng)=34ms,平均=30.0ms
 
Process finished with exit code 0

到此這篇關(guān)于Python實(shí)現(xiàn)PING命令的示例代碼的文章就介紹到這了,更多相關(guān)Python PING命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python3 文章標(biāo)題關(guān)鍵字提取的例子

    Python3 文章標(biāo)題關(guān)鍵字提取的例子

    今天小編就為大家分享一篇Python3 文章標(biāo)題關(guān)鍵字提取的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)表的監(jiān)控警告的項(xiàng)目實(shí)踐

    Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)表的監(jiān)控警告的項(xiàng)目實(shí)踐

    本文主要介紹了使用Python 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的監(jiān)控告警功能, 并將告警信息通過(guò)釘釘機(jī)器人發(fā)送到釘釘群,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • python+selenium+chromedriver實(shí)現(xiàn)爬蟲(chóng)示例代碼

    python+selenium+chromedriver實(shí)現(xiàn)爬蟲(chóng)示例代碼

    這篇文章主要介紹了python+selenium+chromedriver實(shí)現(xiàn)爬蟲(chóng)示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 使用python生成各種常見(jiàn)條形碼及二維碼

    使用python生成各種常見(jiàn)條形碼及二維碼

    條形碼和二維碼是現(xiàn)代信息交換和數(shù)據(jù)存儲(chǔ)的重要工具,它們將信息以圖形的形式編碼,便于機(jī)器識(shí)別和數(shù)據(jù)處理,本文將介紹如何使用Python快速生成各種常見(jiàn)的條形碼如Code 128、EAN-13,以及生成二維碼,需要的朋友可以參考下
    2024-07-07
  • numpy數(shù)組切片的使用

    numpy數(shù)組切片的使用

    本文主要介紹了numpy數(shù)組切片的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 基于Python實(shí)現(xiàn)視頻去重小工具

    基于Python實(shí)現(xiàn)視頻去重小工具

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python語(yǔ)言編寫(xiě)簡(jiǎn)單的視頻去重小工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起嘗試一下
    2023-03-03
  • Python實(shí)現(xiàn)帶下標(biāo)索引的遍歷操作示例

    Python實(shí)現(xiàn)帶下標(biāo)索引的遍歷操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)帶下標(biāo)索引的遍歷操作,結(jié)合具體實(shí)例形式分析了2種帶索引的遍歷操作實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • python用pd.read_csv()方法來(lái)讀取csv文件的實(shí)現(xiàn)

    python用pd.read_csv()方法來(lái)讀取csv文件的實(shí)現(xiàn)

    本文主要介紹了python用pd.read_csv()方法來(lái)讀取csv文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示

    Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示

    這篇文章主要介紹了Python數(shù)據(jù)分析之PMI數(shù)據(jù)圖形展示,文章介紹了簡(jiǎn)單的python爬蟲(chóng),并使用numpy進(jìn)行了簡(jiǎn)單的數(shù)據(jù)處理,最終使用?matplotlib?進(jìn)行圖形繪制,實(shí)現(xiàn)了直觀的方式展示制造業(yè)和非制造業(yè)指數(shù)圖形,需要的朋友可以參考一下
    2022-05-05
  • 深入淺析python定時(shí)殺進(jìn)程

    深入淺析python定時(shí)殺進(jìn)程

    這篇文章主要介紹了深入淺析python定時(shí)殺進(jìn)程的相關(guān)資料,需要的朋友可以參考下
    2016-06-06

最新評(píng)論