首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python TCP ping,时间度量与其他工具有什么不同?

使用Python TCP ping,时间度量与其他工具有什么不同?
EN

Stack Overflow用户
提问于 2017-12-28 22:57:26
回答 1查看 2.3K关注 0票数 0

我正在尝试写一个简单的工具来测量TCP端口的开放程度,代码运行良好。我遇到的问题是,当我将TCP ping结果与其他工具进行比较时,比如psping (Sysinternals),tcpping,check_tcp(Nagios),我得到的结果比我的代码要低得多。在我的代码中,打开TCP端口大约需要9~10ms,其他工具一开始需要0.200~0.500ms,考虑到这与我的计算机上有多个接口的情况有关,我添加了绑定到正确的接口,并且没有改变结果。此外,我还发现了python和其他工具的区别,我使用Wireshark来捕获python和psping,我发现从客户端FIN,ACK的最后握手在Python中要比psping慢得多,这就是10ms的区别。在Python TCP中是否有任何标志可以使其更快?我的问题是,为什么我得到了如此不同的结果?请指教,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-31 02:23:04

正如babygame0ver建议的帖子解决了“延迟”问题,增加了线程和延迟现在很多其他工具感谢

代码语言:javascript
复制
 #!/usr/bin/env python3
"""
TCP Ping Test (defaults to port 80, 10000 packets)

Usage: ./tcpping.py host [port] [maxCount]
- Ctrl-C Exits with Results
"""

import sys
import socket
import time
import signal
from timeit import default_timer as timer
import threading

host = None
port = 80
a = time.clock()
time.sleep(2)
b = time.clock()
print(b-a)
# Default to 10000 connections max
maxCount = 10000
count = 0

## Inputs

# Required Host
try:
    host = sys.argv[1]
except IndexError:
    print("Usage: tcpping.py host [port] [maxCount]")
    sys.exit(1)

# Optional Port
try:
    port = int(sys.argv[2])
except ValueError:
    print("Error: Port Must be Integer:", sys.argv[3])
    sys.exit(1)
except IndexError:
    pass

# Optional maxCount
try:
    maxCount = int(sys.argv[3])
except ValueError:
    print("Error: Max Count Value Must be Integer", sys.argv[3])
    sys.exit(1)
except IndexError:
    pass

# 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)
    s.bind(('192.168.10.19', 0))

    # 1sec Timeout
    s.settimeout(1)


    # Try to Connect
    try:
        # Start a timer


        t = threading.Thread(target=s.connect((host, int(port))))
        #threads.append(t)
        s_start = timer()
        t.start()

        # Stop Timer
        s_stop = timer()
        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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48009669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档