У меня есть библиотека Python, которая использует ctypes
для регистрации обратного вызова с помощью библиотеки C. Подпись обратного вызова:Как использовать ctypes для recv_into в буфере C несколько раз?
CFUNCTYPE(c_int_32, c_uint_32, POINTER(c_byte), POINTER(c_size_t))
В этом случае третий аргумент является указателем на массив байт, выделенный библиотекой C, и четвертый аргумент его длина.
Я хотел бы заполнить массив байтов данными из сети, позвонив по телефону socket.recv_into
. Что еще более важно, я хотел бы, чтобы полностью заполнил этот массив байтов: то есть, если recv_into
возвращает меньше байтов, чем четвертый аргумент этой функции, то я бы снова позвонил recv_into
.
Предположим, что моя функция выглядит следующим образом:
def callback(first, second, buffer, size):
total_read = 0
while total_read < size[0]:
total_read += some_socket.recv_into(buffer, size[0] - total_read)
# XXX: What happens here???
Мой вопрос: как я могу манипулировать значение buffer
, чтобы гарантировать, что каждый вызов recv_into
дописывает в буфер, а не перезаписывать ранее записанные данные?
После вашего комментария к другому ответу: работает ли он, если вы наложили кусок буфера и затем выполнили 'recv_into'? Как 'ctypes.cast (buffer [start: end], ctypes.POINTER (ctypes.c_byte))'. Недостатком является то, что вы должны предоставить конец срезу, иначе интерпретатор жалуется на слишком большую строку. – alexpeits
Я так не думаю. Кусочек буфера дает мне список целых чисел, который, как представляется, был скопирован из базового буфера. Это не бросается. – Lukasa