本地程序间数据流传输的TCP/IP替代方案?

3 投票
4 回答
988 浏览
提问于 2025-04-17 06:27

我有一个GNU C++程序和一个Python脚本,它们需要频繁地互相传递字符串,大约每分钟70到80条消息。它们会在CentOS系统上运行,并且是在同一个环境中。虽然TCP/IP可以完成这个任务,但我还有哪些其他选择呢?

需要注意的是,我不能把我的C++程序变成一个共享库(SO),然后用ctypes把它集成到我的Python脚本中,因为我的C++程序必须编译成32位,而我的Python脚本必须是64位。

4 个回答

2

http://tldp.org/LDP/tlk/ipc/ipc.html

  • 管道
  • 命名管道
  • TCP套接字
  • UNIX域套接字
  • 消息队列
  • 共享内存

我个人更喜欢使用TCP套接字。

  1. 你已经为它们写好了支持代码,
  2. 它们在不同机器之间和同一台机器内部都能很好地工作。
  3. 有很棒的工具可以帮助你调试通信通道。
  4. 还有一些库可以帮助你更方便地使用它们。
5

命名管道是标准的方法。在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()
9

如果你已经有了一个TCP或UDP服务器,最简单的方法可能就是切换到UNIX域套接字。

UNIX域套接字有“流式”和“数据报”两种模式,就像TCP和UDP套接字一样,而且它们总是本地的,因为它们使用的是文件系统的命名空间(而不是像TCP/UDP那样使用端口号)。

撰写回答