python – 如何多次使用ctypes recv_into C缓冲区?

我有一个
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???

我的问题是:如何操作缓冲区的值以确保每次调用recv_into都附加到缓冲区,而不是覆盖以前写入的数据?

最佳答案 在评论的基础上,没有中间铸造:

# assuming we know OFFSET (where to start copying in the buffer)
# and AMOUNT (how many bytes we will read)
tmp_buf = (ctypes.c_char * size).from_address(ctypes.addressof(buffer.contents))
mview = memoryview(tmp_buf)[OFFSET:AMOUNT]
_ = sock.recv_into(mview, AMOUNT)

buffer.contents返回指向缓冲区的指针,因此可以使用ctypes提取其地址

这对我来说是一个简单的C代码,它将预先分配的缓冲区传递给一个在python代码中注册的回调.

点赞