Надежна ли отправка данных через UDP-сокеты на одном компьютере? - PullRequest
24 голосов
/ 24 января 2010

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

Я знаю, что это не так для UDP в целом.

Ответы [ 5 ]

32 голосов
/ 24 января 2010

Нет. Я был укушен этим раньше. Вы можете задаться вопросом, как это может произойти сбой, но вы столкнетесь с проблемами буферов ожидающих заполнения пакетов, и, следовательно, пакеты будут отброшены. То, как сетевая подсистема отбрасывает пакеты, зависит от реализации и нигде не указано.

7 голосов
/ 24 января 2010

Короче, нет. Вы не должны делать никаких предположений о порядке данных, полученных на сокете UDP, даже через локальный хост. Это может сработать, а может и нет, и это не гарантируется.

5 голосов
/ 24 января 2010

Нет, такой гарантии нет даже с местными розетками. Если вам нужен механизм IPC, который гарантирует доставку в порядке, вы можете использовать полнодуплексные каналы с popen(). Это открывает канал для дочернего процесса, который может либо читать, либо писать произвольно. Это гарантирует доставку по заказу и может использоваться с синхронным или асинхронным вводом / выводом (select() или poll()), в зависимости от того, как вы хотите построить приложение.

В Unix есть и другие опции, такие как доменные сокеты Unix или очереди сообщений System V (некоторые из которых могут быть быстрее), но чтение / запись из канала очень проста и работает. В качестве бонуса легко проверить ваш серверный процесс, потому что он просто читает и пишет из Stdio.

В Windows вы можете посмотреть на Named Pipes, которые работают несколько иначе, чем их одноименные Unix, но используются именно для такого рода межпроцессного взаимодействия.

2 голосов
/ 26 января 2010

Loopback UDP невероятно ненадежен на многих платформах, вы можете легко увидеть 50% + потеря данных. Различные оправдания приводятся в связи с тем, что существуют гораздо лучшие транспортные механизмы для использования.

В настоящее время доступно много стеков промежуточного программного обеспечения, которые упрощают использование IPC и позволяют работать на разных платформах. Взгляните на что-то вроде ZeroMQ или 29 LBM West 100 *, которые используют один и тот же API для внутрипроцессного, межпроцессного (IPC) и сетевого взаимодействия.

1 голос
/ 24 января 2010

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

Без контроля потока, ограничивающего выделение памяти ядром для дейтаграмм, я думаю, что это будет столь же ненадежно, как и сетевой UDP.

...