0

我有一个在python3上运行的进程,它必须创建一个模块来调用c库,但在c lib中它必须调用从python3连接的套接字,结果是python3

[python3]--->[c]--->[c socket]--->[python socket]----->[c函数]----->[python3]

如何将 python 类型的套接字转换为 c 类型的套接字?

帮我举个例子,谢谢!

4

1 回答 1

2

AC socket 只是一个文件描述符,用数字表示。

Python 套接字是包装文件描述符的对象。您可以使用该方法从中获取文件描述符编号fileno

例如:

def call_c_code_with_socket(my_socket):
    c_library.c_func(my_socket.fileno())

(我假设你在这里使用 POSIX;在 Windows 上,事情有点复杂,因为你通常使用WSASocket和朋友,它处理不透明SOCKET的句柄而不是简单的整数。)

走另一条路有点棘手。

如果你在 C 中创建了一个套接字,并想在 Python 中使用它,你需要家族、类型和原型值以及 fd 编号——但如果你有它们,fromfd那就是答案。

但是,如果你在 Python 中创建了一个套接字,将它的文件描述符发送给 C 并取回它,你就不想创建一个新的套接字对象;你想找到旧的。您可能会考虑为这种情况创建一个dict映射 fd 编号到socket对象的方法。

最后,请注意不要将您的一段代码与另一段代码做奇怪的事情来混淆。如果您已将下一条协议消息的一半读入 C 中的缓冲区,那么 Python 将需要该半条消息。如果您在 Python 中将套接字设置为非阻塞模式,那么它在 C 中仍然是非阻塞的。依此类推。

于 2013-03-13T05:00:10.240 回答