Лучший способ передачи данных между двумя серверами в C? - PullRequest
1 голос
/ 22 октября 2010

Я написал программу, которая создает сокет TCP и UDP в C и запускает оба сервера.Цель приложения состоит в том, чтобы отслеживать запросы через сокет TCP о том, какие пакеты UDP отправлять (т. Е. Отслеживать что-то вроде «0x01 0x02», и, если я вижу это, тогда сервер UDP анализирует полезную нагрузку и пересылает ее черезна сервер TCP для обработки).Проблема в том, что UDP-сервер будет занят поддержанием другого устройства, буквально отправляя тысячи устройств туда и обратно с этим устройством.Итак, каков наилучший способ непрерывного мониторинга запросов от TCP-сервера, но отправлять ему определенные полезные данные с UDP-сервера по запросу, поскольку UDP-сервер будет занят?

Я изучил pthread с семафорами и / или мьютексом(хотя не уверен, что все операции с сокетами являются потокобезопасными, и если это правильный путь к нему), а также с fork / pipe.Отключение UDP-сервера как дочернего процесса кажется достаточно простым, но я не понимаю, как именно я буду передавать данные, которые мне нужны, между обоими серверами (нужно запрашивать данные из TCP и данные полезной нагрузки из UDP).

Ответы [ 4 ]

1 голос
/ 22 октября 2010

На что вы должны обратить внимание, это libevent , все остальное, что вы заново изобретаете, - это написание этого кода низкого уровня самостоятельно.Вот Учебное пособие , Google , Krugle

Также вам следует использовать некоторый предопределенный протокол между серверами.Есть из чего выбирать.Начиная от чрезвычайно простых XDR до буферов протокола .

1 голос
/ 22 октября 2010

Во-первых, имеет ли смысл объединить эти два сервера в одну программу?Если это так, вам не придется общаться между процессами, и вся логика становится значительно проще.Вам придется подумать о выполнении асинхронного ввода и вывода, и функция select() предназначена именно для этого.Там будет много объяснений о том, как это сделать, и быстрый взгляд найдет эту страницу .

Однако, если вы должны иметь два отдельных процесса, то выВам нужно будет выбрать механизм межпроцессного взаимодействия , из которых их несколько, и ваша операционная система будет зависеть от вашего выбора. pipe , если доступно, может подойти, как и Unix именованный pipe .Или вы можете заглянуть в сторонние фреймворки для передачи сообщений или просто использовать разделяемую память и / или семафоры (но будьте очень осторожны!).

0 голосов
/ 22 октября 2010

Ну, вы наверняка выбрали интересное введение в C!

Вы можете попробовать использовать совместно используемую память. Какая ОС?

0 голосов
/ 22 октября 2010

Вы можете использовать трубы в Unix.Смотри http://tldp.org/LDP/lpg/node11.html

...