在C ++插件和Python程序之间进行通信

时间:2013-07-15 03:13:11

标签: python sockets visual-c++ binding zeromq

我对此有很多疑问,我想我应该问。情况如下:

我正在编写一个C ++ .dll,它将被加载到一个程序“EuroScope.exe”中。在加载时,程序将向dll提供数据,该数据将不断向先前构建的python程序发送数据或从之前构建的python程序接收数据。收到并接受数据后,dll会将其传输到正在运行的应用程序

我正在尝试使用ZeroMQ的套接字解​​决方案,每个人都非常关注。事情是,现在已经2周了,我无法在VS2012中投入使用。我尝试了一切,甚至在他们的主页,邮件列表中打开了一个帖子......没有人知道如何解决它

那么,除了ZeroMQ,您认为我的最佳选择是什么?我已经在那里搜索并阅读了很多它们(协议缓冲区我不喜欢,它太复杂了,我觉得我想做什么)

还有一件事。绑定Python / C ++(例如使用SIP或ctypes)是一个有效的解决方案还是它不能满足我的目的?我已经阅读了一些SIP和ctypes文档,它看起来就像我想要的那样...但同时我想:如果需要将数据发送到Python的加载dll,那么让Python可以访问C ++程序的目的是什么? ??我不知道,我只是被这么多信息所淹没

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

最简单的方法之一是编写一个简单的Python套接字服务器,它执行以下操作:

  1. 侦听已知端口并接受TCP连接
  2. 读取字符串,直到找到'\ n'
  3. 在某些分隔符上拆分该行,例如','或空格,例如flds = line.split(',')
  4. 将第一个字段(flds [0])解释为关键字,将剩余字段解释为在基础python程序中调用函数的参数
  5. 发送一个以'\ n'
  6. 结尾的响应字符串
  7. 继续循环执行第2步到第5步,直到套接字连接关闭或收到某种“CLOSE”命令。
  8. 此类服务器的客户端可以用C ++或Python编写,并且可以:

    1. 连接到已知端口上的TCP套接字
    2. 发送以'\ n'
    3. 结尾的单行命令
    4. 读取响应字符串,直到找到'\ n'
    5. 重复上述过程,直到完成所需任务或关闭套接字连接
    6. 当我需要简单的点对点同步发送/接收协议实现时,我经常使用这种方法。它比ZeroMQ或其他消息排队方法重得多。

      如果您需要异步通信或运行多个服务器线程,那么您可能希望查看类似ZeroMQ的内容。但是,如果我理解正确的话,听起来你的需求会更简单。

      使用字符串比发送二进制数据要慢一些,但是根据我的经验,协议更容易调试,因为您不必担心大小和差异的差异。跨不同平台的二进制类型(int,long,short,float,double)的字节顺序。而且您不必将数据包转储到文件中并在HEX编辑器中查看它们以告知通过网络发送的内容。只需记录文本字符串,就可以很容易地看到发生了什么。

      Python在标准库中具有出色的TCP socket server and client库支持,并且.NET库具有good TcpClient support,如果您决定使用C#编写客户端或决定使用托管C ++,它将很有效。 / p>

      如果您要编写更传统的C ++(非托管),那么您应该能够找到许多Win32套接字编程示例,例如this site with working TCP client & server Win32 socket code examples and online book