Как очистить буфер сокета, чтобы получить последние данные из последнего запроса - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно очистить буфер сокетов, чтобы в нем не было всего «журнала» сокетов.Я должен работать только с последним ответом на мой последний запрос.

Я использую функцию для получения всех данных.Я понимаю, что должен как-то очистить свой буфер сокетов внутри этой функции, но не могу найти способ сделать это.

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.

Большое спасибо!

1 Ответ

1 голос
/ 17 мая 2019

TCP-сокет - это поток. Все, что вы можете сделать, это прочитать все, что уже было получено. Это означает, что если ваша программа похожа на

send req1
receive and process answer1
send req2
receive and process answer2

все должно быть хорошо.

Но вы делаете:

send req1
send req2

тогда вам придется сделать

receive answer1
receive and process answer2
...