gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:25 27 4
gpt4 key购买 nike

我有一个 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 都会附加到缓冲区,而不是覆盖以前写入的数据?

最佳答案

以评论为基础,无需中间转换:

# 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 代码中注册。

关于python - 如何使用 ctypes 多次 recv_into C 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42255313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com