Альтернатива TCP / IP для локальной потоковой передачи данных между программами? - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть программа GNU C ++ и скрипт на python, которые должны передавать строки друг другу довольно часто (~ 70-80 сообщений в минуту). Они будут работать локально друг с другом в CentOS (размещены в той же среде). Чувствуется, что хотя TCP / IP может и будет выполнять свою работу, какие еще варианты у меня есть?

Имейте в виду, что я не могу превратить свою программу на C ++ в SO и интегрировать ее в свой скрипт на python с использованием ctypes, моя программа на C ++ должна быть скомпилирована в 32-битной, а мой скрипт на python должен быть 64-битной.

Ответы [ 4 ]

8 голосов
/ 16 ноября 2011

Если у вас уже есть сервер TCP или UDP, возможно, самый простой способ - переключиться на доменные сокеты UNIX.

Они приходят в режимы «поток» и «датаграмма», как и сокеты TCP / UDP, и они всегда локальны, так как используют пространство имен файловой системы (вместо номеров портов, таких как TCP / UDP).

5 голосов
/ 16 ноября 2011

Именованные трубы являются стандартным методом. В 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 все еще является жизнеспособным вариантом. Также будьте осторожны, чтобы ни одна строка не превышала размер буфера канала (обычно 64 КБ).

Основываясь на предложениях в комментариях, я также добавил пример доменных сокетов 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()
2 голосов
/ 16 ноября 2011

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

  • Трубы * * 1005
  • Именованные трубы
  • TCP-сокеты
  • Сокеты UNIX-домена
  • очереди сообщений
  • Общая память

Безусловно, я бы предпочел сокеты TCP.

  1. Вы уже написали поддержку для них,
  2. Они одинаково хорошо работают как внутри, так и внутри машины.
  3. Есть замечательные инструменты для отладки канала связи.
  4. Существуют библиотеки, которые могут помочь в их использовании.
0 голосов
/ 16 ноября 2011

Может быть, вы можете использовать именованные каналы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...