WinError 10053. Как мне продолжать отправлять данные через TCP "навсегда" - PullRequest
0 голосов
/ 19 марта 2020

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

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

Моя установка - Win10 с Python 3.8

Моя client.py скопированная и измененная форма выше:

# Echo client program
import socket

HOST = '192.168.102.127'    # The remote host
PORT = 21         
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
i=0 #For counting how often the string was sent
while True: #for testing this is forever
    s.sendall(b'Hello, world')
    data = s.recv(1024)#
    print(i)
    i=i+1
    print('Received', repr(data))

My server.py:

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 21             
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)

Я получаю ошибку

ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine после i=5460 (в нескольких попытках) на стороне клиента и

ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host на стороне сервера

Чем длиннее мое текстовое сообщение, тем меньше сообщений было отправлено до ошибки.

Это наводит меня на мысль, что я отправил данные в какой-то буфер, который (over-) записывается до тех пор, пока не будет выдана ошибка. При поиске возможных решений я нашел только разные реализации, которые не покрывали мою проблему или использовали другое программное обеспечение.

Как указано в некоторых ответах на похожие вопросы , я отключил брандмауэр и остановил свой антивирус, но без заметной разницы. При поиске ошибки также возможны ошибки протокола, но я не ожидаю, что это станет проблемой. Читая документацию по сокетам / TCP, я где-то обнаружил, что TCP на самом деле не предназначен для такого рода проблем, а скорее для

client connects to server
           |
           V
client sends request to server
           |
           V
server sends request answer
           |
           V
server closes connection.

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

Чтобы проиллюстрировать более широкую картину:

У меня есть какой-то другой код, который дает мне данные о состоянии (текст) при 500 Гц. В Python я обрабатываю эти данные и отправляю обработанные данные в Arduino со щитом Ethe rnet. Эти данные являются данными в режиме реального времени, поэтому мне нужно, чтобы данные отправлялись в arduino как можно быстрее. Здесь клиент - Python, а Сервер - это Arduino с модулем Ethernet. Связь и все работает нормально, моя проблема только в непрерывной отправке данных.

...