【发布时间】:2013-03-13 04:58:06
【问题描述】:
我有一个在python3上运行的进程,它必须创建一个模块来调用c库,但是在c库中它必须调用从python3连接的socket,结果是python3
[python3]--->[c]--->[c socket]--->[python socket]----->[c函数]----->[python3]
如何将python类型的socket转换为c类型的socket?
帮我举个例子,谢谢!
【问题讨论】:
我有一个在python3上运行的进程,它必须创建一个模块来调用c库,但是在c库中它必须调用从python3连接的socket,结果是python3
[python3]--->[c]--->[c socket]--->[python socket]----->[c函数]----->[python3]
如何将python类型的socket转换为c类型的socket?
帮我举个例子,谢谢!
【问题讨论】:
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 中仍然是非阻塞的。以此类推。
【讨论】: