2017-12-28 8 views
1

Ich versuche ein einfaches Tool zu schreiben, das den offenen TCP-Port misst, der Code funktioniert gut. Das Problem, das ich habe, ist, dass, wenn ich das TCP-Ping-Ergebnis mit anderen Tools, wie psping (Sysinternals), tcpping, check_tcp (Nagios) vergleichen, bekomme ich viel niedrigere Ergebnisse als mein Code. In meinem Code öffnen TCP-Port offen dauert etwa 9 ~ 10ms, andere Werkzeuge dauert 0,200 ~ 0,500ms am Anfang, dachte, es ist mit dem Fall verbunden, wenn ich mehrere Schnittstellen auf meinem Computer habe ich hinzugefügt, um die richtige Schnittstelle zu binden änderte die Ergebnisse nicht. Darüber hinaus fand ich, dass der Unterschied zwischen Python und anderen Tools, Ich benutzte Wireshark, um sowohl Python und psping zu erfassen, und ich fand, dass der endgültige Handshake von Clientseite FIN, ACK ist viel langsamer in Python als psping und das ist die Unterschied die 10ms. Gibt es ein Flag in Python TCP, um es schneller zu machen? Meine Frage ist, warum ich so unterschiedliche Ergebnisse bekomme? Bitte Beratung DankVerwenden für Python TCP-Ping, Zeitmessung Diffrence von anderen Tools?

+1

Verwendung Multi-Threading-Modul zum Ausführen des Codes – babygame0ver

+0

schneller Warum sollten Sie sich kümmern , an erster Stelle? –

+0

Hallo, ich würde mich kümmern, da Präzision benötigt wird, um genaue TCP-Antwortzeit zu messen, so viel wie möglich. – tbaror

Antwort

0

wie vorgeschlagen Beitrag von babygame0ver die „Latenz“ Problem lösen hinzugefügt Einfädeln und Latenz jetzt viel andere Werkzeuge Dank

#!/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() 
+1

Code berechnen Zeit der Thread-Startzeit. Verwenden Sie thread.join(), wenn Sie die Verbindungszeit anzeigen möchten. – kain64b