我有一个在python3上运行的进程,它必须创建一个模块来调用c库,但在c lib中它必须调用从python3连接的套接字,结果是python3
[python3]--->[c]--->[c socket]--->[python socket]----->[c函数]----->[python3]
如何将 python 类型的套接字转换为 c 类型的套接字?
帮我举个例子,谢谢!
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 中仍然是非阻塞的。依此类推。