代码之家  ›  专栏  ›  技术社区  ›  Llamageddon

除了使用系统ping实用程序或发送ICMP数据包来创建网络状态监视器之外,还有其他选择吗?

  •  3
  • Llamageddon  · 技术社区  · 7 年前

    我一直在编写和维护一个ping的个人使用工具 8.8.8.8 每隔1s显示一个pip,指示一段时间内的网络状况,由于我的网络似乎固有约1.7%的丢包,我让它运行两次PING。EXE并行处理,超时950ms,以便区分随机丢弃的数据包和短暂中断(也会发生这种情况)

    现在,问题是:我对PING没有足够的控制,而且我遇到了PING的问题。EXE的延迟1s不够精确,随着进程的漂移,我随机得到 heavily degenerate 像60个PIP这样的病例与 107.24秒 而不是预期的60年代。

    我可能可以通过每秒启动一个新的ping进程来解决这个问题,但这是一个非常不雅观的解决方案,而且开销不可忽略(至少在Windows上),我希望避免手动发送ICMP数据包,因为这样我就需要以管理权限运行我的实用程序。

    我为这个开放式的“有什么事吗”的问题道歉,但我什么都不知道,我不知道该问什么。


    编辑:我尝试将超时从999ms降低到900ms,甚至750ms,但PING。EXE要么不遵守它,要么不正确地遵守它,因为这种情况不断发生,尽管问题是 在最大网络负载下,更小-+15s。可能可以接受,但。。。

    2 回复  |  直到 7 年前
        1
  •  1
  •   dawg    7 年前

    如果需要复制 ping 正是在Python中,您需要管理员权限才能将ICMP数据包发送到主机。

    能够 而是依赖TCP数据包并点击http端口。这不需要管理员权限。也不是 相当地 虽然准确,但它更准确地描述了网络浏览能力。

    简化 this TCP ping代码:

    import sys
    import socket
    import time
    import signal
    from timeit import default_timer as timer
    
    host = "google.com"
    port = 80
    
    # Default to 10000 connections max
    maxCount = 10000
    count = 0
    
    # Pass/Fail counters
    passed = 0
    failed = 0
    
    def getResults():
        """ Summarize Results """
    
        lRate = 0
        if failed != 0:
            lRate = failed / (count) * 100
            lRate = "%.2f" % lRate
    
        print("\nTCP Ping Results: Connections (Total/Pass/Fail): [{:}/{:}/{:}] (Failed: {:}%)".format((count), passed, failed, str(lRate)))
    
    def signal_handler(signal, frame):
        """ Catch Ctrl-C and Exit """
        getResults()
        sys.exit(0)
    
    # Register SIGINT Handler
    signal.signal(signal.SIGINT, signal_handler)
    
    # Loop while less than max count or until Ctrl-C caught
    while count < maxCount:
    
        # Increment Counter
        count += 1
    
        success = False
    
        # New Socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # 1sec Timeout
        s.settimeout(1)
    
        # Start a timer
        s_start = timer()
    
        # Try to Connect
        try:
            s.connect((host, int(port)))
            s.shutdown(socket.SHUT_RD)
            success = True
    
        # Connection Timed Out
        except socket.timeout:
            print("Connection timed out!")
            failed += 1
        except OSError as e:
            print("OS Error:", e)
            failed += 1
    
        # Stop Timer
        s_stop = timer()
        s_runtime = "%.2f" % (1000 * (s_stop - s_start))
    
        if success:
            print("Connected to %s[%s]: tcp_seq=%s time=%s ms" % (host, port, (count-1), s_runtime))
            passed += 1
    
        # Sleep for 1sec
        if count < maxCount:
            time.sleep(1)
    
    # Output Results if maxCount reached
    getResults()
    

    一旦可以创建“ping”,就可以将每次/ping结果的结果封装到对象流中,以便按照您的意愿显示。

        2
  •  0
  •   disk eater    5 年前

    aping 支持这一点。

    下面的示例发送3个ping请求,间隔50ms,每秒发送到8.8.8.8,超时800ms。

    aping -n 3 -i 50 -w 800 -sleep 1 8.8.8.8
    

    每次扫描的定时(-sleep 1)由先前扫描的执行时间进行调整,以确保恒定的1秒节奏,而不考虑所有三个数据包均未响应的响应时间/实例。

    Windows上不需要Admin。

    推荐文章