Если я буду использовать гнезда UDP для коммуникации межпроцесса, то я могу ожидать, что все посылают данные, получен другим процессом в том же заказе?
Я знаю, что это не верно для UDP в целом.
Нет. Меня уже кусали этим раньше. Вы можете задаться вопросом, как это может обернуться неудачей, но у вас возникнут проблемы с заполнением буферов отложенных пакетов, и, соответственно, пакеты будут сброшены. То, как сетевая подсистема сбрасывает пакеты, зависит от реализации и нигде не указывается.
Нет, такой гарантии нет, даже с локальными розетками. Если вам нужен IPC механизм, который гарантирует доставку по заказу, вы можете рассмотреть возможность использования полнодуплексных труб с помощью popen()
. Это открывает канал для дочернего процесса, который может либо читать, либо писать произвольно. Это гарантирует доставку по заказу и может быть использовано с синхронным или асинхронным вводом/выводом (select()
или poll()
), в зависимости от того, как вы хотите собрать приложение.
В unix есть и другие опции, такие как unix-доменные сокеты или очереди System V сообщений (некоторые из них могут быть быстрее), но чтение/запись из канала очень проста и работает. В качестве бонуса легко протестировать серверный процесс, потому что он просто читает и пишет из Stdio.
В окнах Вы можете посмотреть на именованные трубы, которые работают несколько иначе, чем их одноимённые unix, но используются именно для такого рода межпроцессного взаимодействия.
Интерфейс сокета, вероятно, не будет управлять источником данных, так что вы, вероятно, увидите надежную передачу, если у вас есть более высокий уровень управления потоком, но всегда есть вероятность того, что сбой памяти все еще может привести к падению датаграммы.
Без управления потоком, ограничивающего выделение памяти ядра для датаграмм, я думаю, что это будет так же ненадежно, как и сетевое UDP.
Короче говоря, нет. Вы не должны делать никаких предположений о порядке получения данных на UDP-сокет, даже через локальный хост. Это может сработать, а может и нет, и не гарантировано.
Loopback UDP невероятно ненадежна на многих платформах, вы можете легко увидеть 50% + потери данных. Различные оправдания были предоставлены эффекту о том, что существует гораздо лучшие транспортные механизмы для использования.
В наши дни есть много стеков промежуточного программного обеспечения, чтобы сделать IPC легче использовать и пересекать платформу. Посмотрите на что-то вроде Zeromq или 29 LBM West , которые используют то же API для внутрипроцесса, межпроцесса (IPC) и сетевых коммуникаций.