Python socket. не работает recv

При повторном прохождении цикла WHILE, перестает слушать RECV() команды от клиента, но скрипт продолжает работать. Не понимаю что делать. Пишу этот серв для общения с другим устройством тоже через сокет. Если убрать "другое устройство" из кода, все та же ошибка, причем соединение с другим устройством отрабатывает как надо. Помогите пожалуйста, добрые люди!

import socket
import os

SOCKET_FILE = "./echo.socket"

if os.path.exists(SOCKET_FILE):
    os.remove(SOCKET_FILE)

server_cu = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_cu.connect(('192.168.0.178', 5000))
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('', 9193))
server.listen()
conn, addr = server.accept()


def ask_state():
    cmd = [0x02, 0x0A, 0x00, 0x50, 0x03, 0x5F]
    # server_cu.send(bytes(cmd))


def process_state(data=None):
    print(data)
    if data is None:
        print("empty packet")
        return False
    if len(data) != 12:
        print("Packet length mismatch")
    if data[0] != 0x02 or data[2] != 0x00 or data[3] != 0x65 or data[10] != 0x03:
        print("invalid packet")
        return False
    board_number = data[1]
    lock_number = 1
    states = []
    for byte_num in range(4, 10):
        for bit_num in range(0, 8):
            state = 1 if data[byte_num] & (1 << bit_num) > 0 else 0
            print(f"B:{board_number}, L{lock_number}, S{state}")
            states.append([board_number, lock_number, state])
            lock_number += 1
    return str(states)


def unlock_all():
    cmd = [0x02, 0x00, 0x30, 0x51, 0x03, 0x86]
    server_cu.send(bytes(cmd))


while True:
    conn, addr = server.accept()
    datagram = conn.recvfrom(512)
    if not datagram:
        break
    if datagram == b'check_status':
        cmd = [0x02, 0x00, 0x00, 0x50, 0x03, 0x55]
        ask_state()
        states = None
        data_recv = 0
        while states is None:
            data_recv = server_cu.recv(512)
            if len(data_recv) == 12:
                states = False
        server.send(data_recv)

    if datagram == b'unlock_all':
        unlock_all()

    if b'unlock_lock' in datagram:
        cmd = [0x02, 0x00, 0x30, 0x51, 0x03, 0x86]
        server_cu.send(bytes(cmd))
    conn.sendall('Nice'.encode('utf-8'))
server.close()
os.remove(SOCKET_FILE)

В общем, с большой надеждой жду помощи


Ответы (1 шт):

Автор решения: eri

Потому что в цикле вы ожидаете новое соединение к серверу через conn, addr = server.accept()

Уберите эту команду выше по коду, а в цикле вложите ещё один:

while True:
    conn, addr = server.accept()
    while True:
        datagram = conn.recvfrom(512)
        if not datagram:
             break
        .....
→ Ссылка