我在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消息外,我发现无法做到这一点。还有其他办法吗?!
答案 0 :(得分:1)
设置内核以使用以下方式ping连接:
sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 150)
sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 150)
解决了这个问题。
完成此类设置后,连接不会中断,因为我需要。