2011-11-16 54 views
2

我有一个GNU C++程序和一个python脚本,需要相当频繁地将字符串传递给对方(每分钟约70-80条消息)。它们将在CentOS中彼此本地运行(托管在相同的环境中)。感觉虽然TCP/IP可以并将完成这项工作,但我还有其他的选择吗?请记住,我不能将我的C++程序变成SO,并使用ctypes将它集成到我的python脚本中,我的C++程序必须编译为32位,而我的python脚本必须是64位。本地程序到程序数据流的替代TCP/IP?

+0

是什么促使你关注?你有什么理由不满意使用TCP/IP?如果不知道您使用TCP时遇到了什么问题,将很难有用地推荐替代方案。 –

+0

一般好奇心和TCP/IP感觉不必要的唠叨感。您不需要协议提供的整个流量控制/交付保证/握手。 – user1040625

+2

每分钟70-80条消息的速率如此之低,以至于花费任何时间优化IPC机制是浪费时间。无论您能够以最快的速度编码,都是最佳选择。我不知道你的C++程序是什么,但我会认真考虑你是否应该只用python写出所有东西,并避免消息传递。 – TJD

回答

8

如果您已经有TCP或UDP服务器,最简单的方法可能是切换到UNIX域套接字。因为它们使用文件系统命名空间(而不是像TCP/UDP这样的端口号),它们就像TCP/UDP套接字一样处于“流”和“数据报”模式,并且它们始终是本地的。

+3

+1,我很喜欢这种方法,因为它可以让您轻松将这两个进程在未来的代码重写中分离到不同的框中。 – zslayton

+1

但使用UNIX域套接字有什么好处,而不是使用TCP/UDP套接字? –

+0

通过tcp/ip使用域套接字有什么优点和缺点? – user1040625

0

也许你可以使用命名管道?

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() 
+0

你知道它在C++结尾的样子吗?我不确定什么库这样做。 – user1040625

+3

命名管道是单向的。 UNIX域套接字是双向的,所以对于“交换消息”可能会更好。 – Martijn

+0

@ user1040625它被视为一个文件,所以你可以使用标准的fopen/fread/fwrite调用。在sys/stat.h中有'mkfifo'。 –

2

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

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

到目前为止,我更喜欢TCP套接字。

  1. 你已经写了他们的支持,
  2. 他们同样出色的工作间和细胞内的机器。
  3. 有很好的工具来调试通信通道。
  4. 有些图书馆可以协助他们的使用。