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