我有一个GNU C++程序和一个python脚本,需要相当频繁地将字符串传递给对方(每分钟约70-80条消息)。它们将在CentOS中彼此本地运行(托管在相同的环境中)。感觉虽然TCP/IP可以并将完成这项工作,但我还有其他的选择吗?请记住,我不能将我的C++程序变成SO,并使用ctypes将它集成到我的python脚本中,我的C++程序必须编译为32位,而我的python脚本必须是64位。本地程序到程序数据流的替代TCP/IP?
回答
如果您已经有TCP或UDP服务器,最简单的方法可能是切换到UNIX域套接字。因为它们使用文件系统命名空间(而不是像TCP/UDP这样的端口号),它们就像TCP/UDP套接字一样处于“流”和“数据报”模式,并且它们始终是本地的。
+1,我很喜欢这种方法,因为它可以让您轻松将这两个进程在未来的代码重写中分离到不同的框中。 – zslayton
但使用UNIX域套接字有什么好处,而不是使用TCP/UDP套接字? –
通过tcp/ip使用域套接字有什么优点和缺点? – user1040625
也许你可以使用命名管道?
命名管道是标准方法。在Python中:
import os
os.mkfifo('/some/path')
# Reading process
with open('/some/path') as pipe:
for line in pipe:
# Do what you need
# Writing process
with open('/some/path', 'w') as pipe:
while True: # Whatever looping process you have
pipe.write('<data>' + '\n')
请注意,在现代系统上,70-80信息/分钟并不是那么高,TCP仍然是一个可行的选项。还要小心,没有一个字符串大于管道缓冲区大小(一般为64K)。
根据评论中的建议,我还添加了一个UNIX域套接字的示例,如果您需要双向通信,它将更加有用。
# Server Side
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind("/some/path")
sock.listen(1)
conn, addr = sock.accept()
while True:
data = conn.recv(1024)
if not data:
break
# Let's echo it back as an example
conn.send(data)
conn.close()
# Client Side
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/some/path")
while True: # Your sending loop
# In this case we send hello world, and print what we get back.
sock.send('Hello, world')
data = sock.recv(1024)
print data
sock.close()
你知道它在C++结尾的样子吗?我不确定什么库这样做。 – user1040625
命名管道是单向的。 UNIX域套接字是双向的,所以对于“交换消息”可能会更好。 – Martijn
@ user1040625它被视为一个文件,所以你可以使用标准的fopen/fread/fwrite调用。在sys/stat.h中有'mkfifo'。 –
http://tldp.org/LDP/tlk/ipc/ipc.html
- 管道
- 命名管道
- TCP套接字
- UNIX域套接字
- 消息队列
- 共享内存
到目前为止,我更喜欢TCP套接字。
- 你已经写了他们的支持,
- 他们同样出色的工作间和细胞内的机器。
- 有很好的工具来调试通信通道。
- 有些图书馆可以协助他们的使用。
- 1. 如何查看程序发送到本地mySQL数据库的本地流量?
- 2. 记事本++程序员的替代
- 3. 从iPhone本地应用程序远程发送数据到Rails应用程序
- 4. jqGrid远程数据,本地排序
- 5. 应用程序本地数据库
- 6. android传感器程序发送数据到本地数据库
- 7. 本地数据流服务器上的Spring云流聚合应用程序
- 8. 替代Windows凭据提供程序
- 9. 将流星应用程序从本地数据库切换到远程/云数据库
- 10. 从Raspberry PI到本地iOS应用程序的流视频?
- 11. 替代应用程序根
- 12. C++程序的数据流分析
- 13. C程序的数据流图生成
- 14. 提供本地和远程数据访问的应用程序
- 15. Windows Store应用程序中的本地和远程数据库
- 16. 反向WCF将连接到一个非.net tcpip应用程序
- 17. 流星应用程序连接到本地主机mongodb
- 18. 从Android应用程序发送Json到本地数据库
- 19. 将数据从本地Rails应用程序推送到Elastic Beanstalk
- 20. 将Android应用程序中的值(数据)传递给本地应用程序?
- 21. 本地化应用程序商店中的元数据应用程序名称
- 22. 移动应用程序的数据库替代
- 23. 理解阵营本地程序流程 - 循环
- 24. Java程序流程
- 25. 程序流程C#
- 26. 程序捕获某个程序连接的数据和地址
- 27. iPhone应用程序本地或远程数据库
- 28. 流星应用程序剖析数据
- 29. 替代的mod_python的CGI处理程序
- 30. 混乱的程序流程
是什么促使你关注?你有什么理由不满意使用TCP/IP?如果不知道您使用TCP时遇到了什么问题,将很难有用地推荐替代方案。 –
一般好奇心和TCP/IP感觉不必要的唠叨感。您不需要协议提供的整个流量控制/交付保证/握手。 – user1040625
每分钟70-80条消息的速率如此之低,以至于花费任何时间优化IPC机制是浪费时间。无论您能够以最快的速度编码,都是最佳选择。我不知道你的C++程序是什么,但我会认真考虑你是否应该只用python写出所有东西,并避免消息传递。 – TJD