我有一个在python3上运行的进程,它必须创建一个模块来调用c库,但在c lib中它必须调用从python3连接的socket,并且结果为python3
[python3] ---> [c] ---> [c socket] ---> [python socket] -----> [c function] -----> [python3]
如何将python类型套接字转换为c类型套接字?
帮我举个例子,谢谢!
答案 0 :(得分:2)
C套接字只是一个文件描述符,用数字表示。
Python套接字是一个包装文件描述符的对象。您可以使用fileno
方法从中获取文件描述符编号。
例如:
def call_c_code_with_socket(my_socket):
c_library.c_func(my_socket.fileno())
(我假设你在这里使用POSIX;在Windows上,事情有点复杂,因为你经常使用WSASocket
和朋友,它处理不透明的SOCKET
句柄而不是简单的整数。)
走另一条路有点棘手。
如果您在C中创建了一个套接字,并希望在Python中使用它,那么您需要family,type和proto值以及fd数字 - 但是如果你有它们,fromfd
是答案。
但是,如果在Python中创建套接字,将其文件描述符发送到C,并将其取回,则不希望创建新的套接字对象;你想找到旧的。您可以考虑为该案例创建dict
映射fd编号到socket
个对象。
最后,小心不要将一段代码与另一段代码混淆。如果您已将下一个协议消息的一半读入C中的缓冲区,那么Python将需要该半消息。如果你在Python中将套接字设置为非阻塞模式,它在C中仍然是非阻塞的。依此类推。