为什么TCP连接太早破坏?

时间:2016-11-29 15:24:14

标签: python tcp timeout freebsd tcp-ip

我在FreeBSD上运行以下Python程序:

#!/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消息外,我发现无法做到这一点。还有其他办法吗?!

1 个答案:

答案 0 :(得分:1)

设置内核以使用以下方式ping连接:

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

解决了这个问题。

完成此类设置后,连接不会中断,因为我需要。