替代TCP/IP用于本地程序到程序数据流?

use*_*625 2 c++ python linux networking gcc

我有一个GNU C++程序和一个python脚本,需要经常相互传递字符串(每分钟约70-80条消息).它们将在CentOS中相互本地运行(托管在相同的环境中).感觉虽然TCP/IP可以并且将完成工作,但我还有其他选择吗?

请记住,我不能将我的C++程序转换为SO并使用ctypes将其集成到我的python脚本中,我的C++程序必须以32位编译,而我的python脚本必须是64位.

Mar*_*ijn 8

如果您已有TCP或UDP服务器,最简单的方法可能是切换到UNIX域套接字.

它们采用"流"和"数据报"模式,就像TCP/UDP套接字一样,它们总是本地的,因为它们使用文件系统命名空间(而不是像TCP/UDP这样的端口号).

  • +1,我是这种方法的粉丝,因为它允许您在将来通过最少的代码重写轻松地将两个进程分离到不同的盒子上. (3认同)

Zac*_*oom 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')
Run Code Online (Sandbox Code Playgroud)

请注意,在现代系统上,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()
Run Code Online (Sandbox Code Playgroud)

  • 命名管道是单向的.UNIX域套接字是双向的,因此"交换消息"可能更好. (3认同)