2016-10-13 3 views
0

Я работаю над настольным приложением OS X, содержащим две отдельные службы. Первый, реализованный в C, собирает данные в фоновом режиме и передает их во второй, пользовательский интерфейс, реализованный в Цель C. После обновления пользовательский интерфейс отвечает на программу C с подтверждением, поэтому между программами существует двусторонняя связь.Межпроцессная связь между XCode (Objective C) и программой C

В настоящее время я использую TCP-сокеты для взаимодействия между процессами, и он работает, но иногда сообщения через соединение сокета задерживаются на 45 секунд. Существует ли альтернативный механизм, обеспечивающий высокую скорость, минимальную задержку между сообщениями между моими программами C и Objective C?

Я использую XCode.

+1

Зависит от вашего определения «лучше». Есть, конечно, аргументы в пользу сокетов домена unix, разделяемой памяти, труб и т. Д. Какие функции вам интересны? (То есть, что такое метрика, по которой вы измеряете один метод, чтобы быть «лучше», чем другой?) –

+0

Я хочу что-то вроде notifier.A notifier, который работает на кросс-платформенном программном обеспечении. Если какое-то изменение происходит в службе C, я отправляю его UI, где цель C получает его. Я делаю это с помощью сокетов. –

+0

@syammala, это действительно не говорит о том, какие характеристики механизма МПК важны для вас, если судить, лучше ли другой. Если я правильно вас понимаю, то, что у вас уже есть, так неужели вы это недовольны? –

ответ

2

Перед тем, как переставить свою основную рабочую реализацию для чего-то совершенно другого, стоило бы попытаться настроить ее, чтобы избавиться от нежелательной задержки. Это может быть так же просто, как изменение параметров сокета через setsockopt(). В частности, кажется, что вы можете извлечь выгоду из отключения Nagle's algorithm на сокетах, установив опцию TCP_NODELAY. Этот пример кода для этого копируется, с незначительными изменениями, от http://www.unixguide.net/network/socketfaq/2.16.shtml:

#include <sys/socket.h> 
#include <netinet/in.h> 

int flag = 1; 
int result = setsockopt(sock,   /* socket affected */ 
         IPPROTO_TCP,  /* set option at TCP level */ 
         TCP_NODELAY,  /* name of option */ 
         &flag, 
         sizeof(int)); /* length of option value */ 
if (result < 0) 
    ... handle the error ... 

Следующая не менее разрушительный вариант, чтобы попытаться будет переключиться на Unix-сокеты (AF_UNIX) вместо TCP сокетов. В самом деле, это лучший лучший выбор, чем TCP для связи между двумя процессами, которые всегда гарантируются для работы на одном и том же хосте, и это все еще интерфейс сокета.

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

+0

Спасибо .. Ваша помощь очень ценится –