2016-11-29 4 views
0

Ich betreibe das folgende Python-Programm unter FreeBSD:Warum TCP-Verbindung zu früh unterbrochen wird?

#!/usr/bin/python 

import socket 

host = '' 
port = 9000 

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
serversocket.bind((host, port)) 
serversocket.listen(5) 

while True: 
    sock, address = serversocket.accept() 
    print("Connected ", address) 
    sock.settimeout(3600) 
    data = sock.recv(4096) 
    sock.close() 
    print("Disconnected") 

Dann habe ich es mit telnet XXX 9000 verbinden. Die Verbindung ist nach 5 Minuten und ein paar Sekunden unterbrochen. Warum ist es nach 300 Sekunden (naja eigentlich 304 Sekunden) statt 3600 Sekunden (was ich in der settimeout Methode eingestellt habe) kaputt ?!

Ich muss meine TCP-Verbindung für einen längeren Zeitraum ausführen, aber ich habe keine Möglichkeit gefunden, es zu tun, außer dem Senden von Non-Sense-Ping-Nachrichten. Gibt es einen anderen Weg ?!

+0

Es gibt zwei Enden eines Sockels; Hat die andere Seite es geschlossen? –

+0

@FilipHaglund Ich denke, es ist nicht – porton

+0

Standard-Timeout für Telnet auf Windows scheint eine Stunde zu sein. Kann keinen Wert für BSD finden. Versuchen Sie es mit netcat (da dies standardmäßig kein Timeout hat) https://www.freebsd.org/cgi/man.cgi?nc –

Antwort

1

den Kernel Einstellung der Verbindung ping mit:

sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 150) 
sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 150) 

löst das Problem.

Nach solchen Einstellungen bricht die Verbindung nicht, wie ich brauche.

Verwandte Themen