如何清除套接字缓冲区以从最新请求中获取最新数据
How to clear socket buffer to get the latest data from the latest request
我需要清除套接字缓冲区,以免其中包含所有套接字 "log"。
我只需要处理最新请求的最新响应。
我正在使用一个函数来接收所有数据。
我知道我应该以某种方式清空该函数内的套接字缓冲区,但找不到可以做到这一点的方法。
def recv_timeout(the_socket, timeout=2):
# делаем сокет не блокируемым
the_socket.setblocking(0)
total_data = []
data = ''
begin = time.time()
while 1:
if total_data and time.time() - begin > timeout:
break
elif time.time() - begin > timeout * 2:
break
try:
data = the_socket.recv(8192)
if data:
total_data.append(data)
begin = time.time()
else:
time.sleep(0.1)
except:
pass
return b''.join(total_data)
当我发送这样的请求时:
client_socket.sendall('list\r\n'.encode("utf-8"))
我的请求得到了正常回复。
但是当我做
client_socket.sendall('recv 1\r\n'.encode("utf-8"))
在上一个请求之后,我立即得到答案 1 + 答案 2,但我只需要答案 2。
非常感谢!
TCP 套接字是一个流。您所能做的就是阅读已经收到的所有内容。这意味着如果你的程序是
send req1
receive and process answer1
send req2
receive and process answer2
一切都应该没问题。
但是你这样做了吗:
send req1
send req2
那么你将不得不做
receive answer1
receive and process answer2
我需要清除套接字缓冲区,以免其中包含所有套接字 "log"。 我只需要处理最新请求的最新响应。
我正在使用一个函数来接收所有数据。 我知道我应该以某种方式清空该函数内的套接字缓冲区,但找不到可以做到这一点的方法。
def recv_timeout(the_socket, timeout=2):
# делаем сокет не блокируемым
the_socket.setblocking(0)
total_data = []
data = ''
begin = time.time()
while 1:
if total_data and time.time() - begin > timeout:
break
elif time.time() - begin > timeout * 2:
break
try:
data = the_socket.recv(8192)
if data:
total_data.append(data)
begin = time.time()
else:
time.sleep(0.1)
except:
pass
return b''.join(total_data)
当我发送这样的请求时:
client_socket.sendall('list\r\n'.encode("utf-8"))
我的请求得到了正常回复。 但是当我做
client_socket.sendall('recv 1\r\n'.encode("utf-8"))
在上一个请求之后,我立即得到答案 1 + 答案 2,但我只需要答案 2。
非常感谢!
TCP 套接字是一个流。您所能做的就是阅读已经收到的所有内容。这意味着如果你的程序是
send req1
receive and process answer1
send req2
receive and process answer2
一切都应该没问题。
但是你这样做了吗:
send req1
send req2
那么你将不得不做
receive answer1
receive and process answer2