【发布时间】:2017-02-16 20:32:21
【问题描述】:
我有一个 Python 库,它使用 ctypes 向 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))。缺点是你必须为切片提供一个结尾,否则解释器会抱怨字符串太大。 -
我不这么认为。缓冲区的一部分给了我一个整数列表,它似乎是从底层缓冲区中复制出来的。那不投。