使用python3和c / c ++嵌入套接字

时间:2013-03-13 04:58:06

标签: python c sockets

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

[python3] ---> [c] ---> [c socket] ---> [python socket] -----> [c function] -----> [python3]

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

帮我举个例子,谢谢!

1 个答案:

答案 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中仍然是非阻塞的。依此类推。

相关问题