У меня есть сетевое программное обеспечение, которое использует UDP для связи с другими экземплярами той же программы. По разным причинам я должен использовать здесь UDP.
Недавно у меня были проблемы с отправкой огромных объемов данных по UDP, и мне пришлось внедрить систему фрагментации, чтобы разделить мои сообщения на небольшие фрагменты данных. До сих пор это работало хорошо, но теперь я столкнулся с проблемой, когда мне нужно отправить много фрагментов данных.
У меня следующий алгоритм:
- Разделить сообщение на небольшие фрагменты данных (около 1500 байт)
- Переберите список фрагментов данных и для каждого отправьте его с помощью
sendto()
Однако, когда я отправляю много блоков данных, получатель получает только первые 6 сообщений. Иногда он пропускает шестой и получает седьмой. По-разному.
В любом случае, sendto()
всегда указывает на успех. Это всегда происходит, когда я тестирую свое программное обеспечение через петлевой интерфейс (127.0.0.1), но никогда не через свою локальную сеть.
Если я добавлю что-то вроде std::cout << "test" << std::endl;
между sendto()
, то будут получены все кадры.
Я знаю, что UDP допускает потерю пакетов и что мои кадры могут быть потеряны по многим причинам, и я полагаю, что это связано со скоростью, с которой я отправляю фрагменты данных.
Какой подход здесь будет правильным?
- Реализация какого-либо механизма подтверждения (так же, как TCP) кажется излишним.
- Добавление некоторого произвольного времени ожидания между
sendto()
некрасиво и, вероятно, снизит производительность. - Увеличение (если возможно) внутреннего буфера UDP получателя? Я даже не знаю, возможно ли это.
- Что-то другое ?
Мне очень нужны ваши советы здесь.
Спасибо большое.
Дополнительная информация по запросу
Причина, по которой я должен использовать UDP, заключается в том, что у меня есть несколько ограничений:
- TCP не работает хорошо с обходом NAT (по крайней мере, без специальной настройки)
- Некоторые сообщения могут быть потеряны. Некоторые другие не могут.
- Порядок доставки сообщений не имеет значения.