Посылает данные через гнезда UDP на той же надежной машине?

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

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

24
задан Lothar 24 January 2010 в 20:36
поделиться

5 ответов

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

32
ответ дан 28 November 2019 в 23:23
поделиться

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

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

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

5
ответ дан 28 November 2019 в 23:23
поделиться

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

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

1
ответ дан 28 November 2019 в 23:23
поделиться

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

6
ответ дан 28 November 2019 в 23:23
поделиться

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

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

2
ответ дан 28 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: