2016-11-29 4 views
0

я запускаю следующую программу Python на FreeBSD:Почему TCP-соединение прерывается слишком рано?

#!/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") 

Затем я подключить к нему с telnet XXX 9000. Соединение прерывается через 5 мин и несколько секунд. Почему он прерывается через 300 секунд (ну на самом деле 304 секунды) вместо 3600 секунд (что я установил в методе settimeout) ?!

Мне нужно запустить мое TCP-соединение в течение длительного периода времени, но я не нашел способа сделать это, за исключением отправки сообщений с нечувствительным пингом. Есть ли другой путь?!

+0

Есть два конца гнезда; другая сторона закрыла его? –

+0

@FilipHaglund Я думаю, что это не – porton

+0

По умолчанию тайм-аут для telnet на окнах, кажется, час. Невозможно найти значение для BSD. Попробуйте использовать netcat (поскольку у него нет тайм-аута по умолчанию) https://www.freebsd.org/cgi/man.cgi?nc –

ответ

1

Установка ядра свистеть соединение с:

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

решает эту проблему.

После таких настроек соединение не прерывается, как мне нужно.