Подтвердить что ты не робот

Является ли отправка данных через сокеты UDP на том же самом компьютере надежным?

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

Я знаю, что это не относится к UDP вообще.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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