为什么TCP连接打破得太早?

为什么TCP连接打破得太早?

问题描述:

我在FreeBSD上运行下面的Python程序:为什么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连接,但我发现没有办法做到这一点,除了发送无意义的ping消息。有没有其他的方法?

+0

有一个插座的两端;另一方关闭了吗? –

+0

@FilipHaglund我认为,它不是 – porton

+0

Windows上的telnet默认超时似乎是一个小时。找不到BSD的值。尝试使用netcat(因为默认没有超时)https://www.freebsd.org/cgi/man.cgi?nc –

设置内核来ping与连接:

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

解决了这个问题。

经过这样的设置后,连接不会中断,因为我需要。