LINUX.ORG.RU

Как передавать данные между приложения.

 


0

2

В общем есть демон и есть другая прога, которая будет передать данные демону, а он ей. Приложения обмениваются текстовыми и бинарными данными во много потоков.

Варианты

  • socket
  • fifo
  • pipe
  • разделяемая память
  • семафор
  • другой?

В какие случаях использовать каждый из вариант. И какой вариант лучше всего подойдет мне? Почему?

Склоняюсь к использованию сокета, т.к считаю, что в других вариантах нужны будут блокировки. Также хочу сказать, что демон очень медленно обрабатывает данные и не хочется тратить время на tcp socket, то есть придется писать через udp, что может привести к потерям.

Данные то как через семафор передавать? Азбукой Морзе? :-) Семафор как средство синхронизации при обмене данными через разделяемую память/файловую систему.

Какое время тратится на tcp-сокет я не понял, с ним же можно работать в неблокирующемся режиме.

Универсального решения нет, но если в последствии нужно будет, чтобы это работало на разных серверах, то, тогда сетевые сокеты (tcp), если данные могут обратыватся повторно, то разделяемая память. pipe и fifo по сути одно и достаточно блико к сокету, поэтому, ИМХО, сначала определите разделяемая память или сокет, а уже потом дальше.

mky ★★★★★
()
Ответ на: комментарий от mky

о tcp я имел ввиду 3 запроса (передача, подтверждения).

henewuge
() автор топика

unix domain socket для клиентов на том же хосте, для всего остального tcp. это, наверное, самое универсальное решение.

fifo - надо самому городить двусторонню связь между процессами pipe - удобно только для связи процессов подитель-потомок shared memory - нужна синхронизация semaphore - штоа?

unix domain socket значительно быстрее чем tcp socket, умеет как в stream, так и dgram.

cyanide_regime
()
Ответ на: комментарий от mky

повторно данные обрабатываться не могут. Пользователю нужно запретить ставить демон на другой машине и подключатся к ней, т.к тогда смогут подключатся и другие пользователи. Нужно сколько пользователей сколько и машин.

Если ли сокеты, которые работают на одной машине и не могут подключатся к другим даже в рабочей сети?

henewuge
() автор топика
Ответ на: комментарий от henewuge

Как вам уже посоветовали, используйте unix-сокеты.

mky ★★★★★
()

http + json попробуй

anonymous
()

еще DBus можно посмотреть, возможно подойдет.

CryAngel
()

ZeroMQ + protobuf и не парься.

anonymous
()
Ответ на: комментарий от henewuge

Так биндись на локалхост. Если демон пер-xoct, то локальный сокет. Если пер-процесс, то socketpair(). Локально датаграмы не теряются, но по-мойму ты путаешь tcp/udp vs blocking/non-blocking (ака асинхронка через poll/select/etc). UDP также счастливо зависнет на recv, если данных нет.

(Омг, что за херня вместо капчи?)

anonymous
()

руски изык подъучьи

anonymous
()

Напомню ещё, что IPC умеет не только Semaphores, Shared Memory, но и Message Queues.

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.