Идиома для получения сокетов в Python

У меня есть некоторый опыт программирования сокетов с использованием API сокетов Беркли на C. Как правило, любое программирование сокетов требует стратегии, которая позволяет принимающий сокет, чтобы знать, сколько данных он должен получить. Это может быть выполнено с помощью полей длины заголовка или символов-разделителей. Как правило, я предпочитаю поле заголовка, которое содержит длину.

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

uint16_t bytes_to_receive;
recv(sock, &bytes_to_receive, sizeof(bytes_to_receive), 0);
bytes_to_receive = ntohs(bytes_to_receive);
// Now receive 'bytes_to_receive' bytes...

Но как такого рода идиома достигается с помощью сокетов Python? В Python целые числа являются объектами, а маринованные целые числа представляют собой массивы байтов переменной длины. Таким образом, мы не можем использовать маринованное целое число в качестве поля заголовка длины, потому что мы не можем быть уверены в его размере в байтах.

Конечно, я всегда мог бы отправить массив байтов известного размера, содержащий двоичное целое число, например b '\ x05 \ x00' для создания 16-битного двоичного целого числа со значением 5 в формате с прямым порядком байтов, но это действительно не похоже на правильный подход.

Итак, как это обычно выполняется в Python?

6
задан Channel72 21 March 2011 в 16:35
поделиться