我目前第一次使用python的套接字库,而且我对计算机网络的熟练程度不高。
我能够连接到服务器并且由wireshark查看tcp握手已经发生。建立与服务器的连接后(我无法控制服务器),连接保持打开一段时间,但在很短的时间后,服务器发送“FIN,ACK”并终止连接。我试图了解如何在客户端能够到达服务器时保持此连接的活动。
查看tcp连接,似乎每隔一段时间就可以发送一个数据包。也许是一种保持活力的信息。我曾想过在另一个线程中每5秒钟使用socket.send('hello')
将保持与服务器的连接打开,但是在一段时间后我仍然会得到“FIN,ACK”。
在文档中我找到了setsockopt()
但是使用它没有明显区别。在连接之前和之后我都尝试了client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
。我不完全理解这个方法应该如何工作,所以也许我错误地使用它。没有太多提及这一点。我在某处看到它在窗户上被打破了。我不知道真相。
我错过了什么?除非我可能遗漏了某些内容,否则套接字的文档似乎没有任何相关内容。
import socket
import time
import threading
SERVER_IP = 'THE SERVER'
SERVER_PORT = SERVER_PORT
SOURCE_IP = socket.gethostname()
SOURCE_PORT = 57004
KEEP_ALIVE_INTERVAL = 5
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def keep_alive(interval):
data = 'hello'
while True:
client.send(data)
time.sleep(interval)
client.connect((SERVER_IP, SERVER_PORT))
t = threading.Thread(target=keep_alive, args = (KEEP_ALIVE_INTERVAL,))
t.start()
while True:
data = client.recv(1024)
if not data:
break
print data
client.close()
答案 0 :(得分:1)
为了保持活着,How to change tcp keepalive timer using python script?
有一个重复的问题请记住,一些服务器和中间代理强制关闭长期连接,无论是否使用alive,在这种情况下,无论如何,您都会在X时间后看到FIN,ACK。