【问题标题】:socket embedding with python3 and c/c++使用 python3 和 c/c++ 嵌入套接字
【发布时间】:2013-03-13 04:58:06
【问题描述】:

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

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

如何将python类型的socket转换为c类型的socket?

帮我举个例子,谢谢!

【问题讨论】:

    标签: python c sockets


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2014-04-17
      • 1970-01-01
      • 2018-08-02
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多