Почему функция socket.send(array_byte) не отправляет полные данные?

Пожалуйста, помогите мне, я использую Asyncore для кодирования сервера в Python (Python 2.7).

с пакетом (является байтом массива) есть len (пакет) < 1288: отправить нормально.

но с пакетом len (пакет) > 1288, я вызываю socket.send(packet_byte), клиент не получает полные данные

p/s: клиент recv:

print 'Received:', data, len(data)

...."e0 ng\u00e0y th\u1ee9 bao nhi\u00eau c\u1ee7a th\u00e1ng \u0111\u1ea7u ti\u00ean c\u1ee7a n\u0103m d\u01b0\u01a1ng l\u1ecbch ho\u1eb7c n\u0103m t\u00e0i ch\u00ednh \u0111\u1ed1i v\u1edbi lo\u1ea1i thu\u1ebf khai v\u00e0 n\u1ed9p theo n\u0103m?", "answers": ["Ng\u00e0y 10",  1288

1 ответ

Ну, это не обязательно. Согласно "сокету" документов:

send() Возвращает количество отправленных байтов. Приложения отвечают за проверку того, что все данные были отправлены; если были переданы только некоторые данные, приложение должно попытаться доставить оставшиеся данные.

И вот немного измененный пример реализации из https://docs.python.org/2/howto/sockets.html:

def mysend(sock, msg):
    totalsent = 0
    while totalsent < MSGLEN:
        sent = sock.send(msg[totalsent:])
        if sent == 0:
            raise RuntimeError("socket connection broken")
        totalsent = totalsent + sent

Примечание. На самом деле обработка сокетов напрямую НЕ требуется при использовании asyncore. Asyncore упаковывает его для вас (рассмотрите возможность наследования asyncore.dispatcher_with_send и использования его метода send()).

Другие вопросы по тегам