2016-08-12 148 views
3

我目前首次使用python的套接字库,并且我对计算机网络不是很熟练。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() 

回答

1

为了能够存活存在于How to change tcp keepalive timer using python script?

重复的问题,记住一些服务器和中间代理强行关闭长期存活的连接,无论保持活动的使用与否,在这种情况下,你会看到无论发生什么,X时间后都会有一个FIN,ACK。

+0

谢谢。保持活动正在发送,但服务器仍然关闭连接。也许有服务器期望的数据,并在没有收到数据后关闭。 –

相关问题