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

Быстрая кросс-платформа Inter Process Communication в С++

Я ищу способ получить две программы для эффективной передачи большого количества данных друг другу, которые должны работать в Linux и Windows, на С++. Контекст здесь представляет собой сетевую программу P2P, которая действует как node в сети и работает непрерывно, а другие приложения (которые могут быть играми, следовательно, необходимость быстрого решения) будут использовать это для связи с другими узлами в сети. Если бы там было лучшее решение, мне было бы интересно.

4b9b3361

Ответ 1

boost:: asio - это кросс-платформенная библиотека, обрабатывающая асинхронные сокеты. Вы можете комбинировать это с использованием Буферов протокола Google для ваших фактических сообщений.

Boost также предоставляет вам boost:: interprocess для межпроцессного общения на одном компьютере, но asio позволяет вам осуществлять асинхронное общение, и вы можете легко иметь одинаковые обработчики для локальных и удаленных соединений.

Ответ 2

Я использую ICE с помощью ZeroC (www.zeroc.com), и это было фантастично. Супер прост в использовании, и он не только кросс-платформенный, но и поддерживает многие языки (python, java и т.д.) И даже встроенную версию библиотеки.

Ответ 3

Хорошо, если мы можем предположить, что два процесса работают на одной машине, то самый быстрый способ передачи больших объемов данных взад и вперед состоит в сохранении данных внутри области общей памяти; с этой настройкой данные никогда не копируются вообще, поскольку оба процесса могут получить к нему доступ напрямую. (Если вы хотите пойти еще дальше, вы можете объединить две программы в одну программу, причем каждый прежний "процесс" теперь выполняется как поток внутри одного и того же пространства процесса. В этом случае они будут автоматически делить 100% своей памяти друг с другом)

Конечно, в большинстве случаев недостаточно обладать общей областью памяти: вам также понадобится какой-то механизм синхронизации, чтобы процессы могли безопасно читать и обновлять данные общего доступа, не отрываясь друг от друга. То, как я бы это сделал, было бы создать две очереди с двойным завершением в области разделяемой памяти (по одному для каждого процесса для отправки). Либо используйте незанятый класс FIFO-queue, либо дайте каждой двунаправленной очереди семафор/мьютекс, который вы можете использовать для сериализации толкания элементов данных в очередь и выталкивания элементов данных из очереди. (Обратите внимание, что элементы данных, которые вы помещаете в очереди, будут только указателями на фактические буферы данных, а не сами данные... в противном случае вы вернетесь к копированию больших объемов данных вокруг, чего вы хотите избежать. Рекомендуется использовать shared_ptrs вместо простых указателей C, чтобы "старые" данные автоматически освобождались, когда процесс получения был выполнен с использованием). После того, как вы это сделаете, вам понадобится только то, что процесс A должен уведомить процесс B, когда он просто поместил элемент в очередь для получения B (и наоборот)... Обычно я делаю это записывая байт в канал, который другой процесс выбирает(), чтобы заставить другой процесс просыпаться и проверять его очередь, но есть и другие способы сделать это.

Ответ 4

Это трудная проблема.

Узким местом является Интернет, и ваши клиенты могут быть на NAT.

Если вы не говорите по интернету, или если у вас явно нет клиентов за NAT NAT, то вам нужно сказать.

Потому что это сводится к: использованию TCP. Отсоедините его.

Ответ 6

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

Во-первых, ICE библиотека здесь - это метод обхода NAT, который работает с серверами STUN и/или TURN в сети. Возможно, вам придется предоставить некоторую инфраструктуру для работы, хотя есть некоторые публичные STUN-серверы.

Во-вторых, используйте UPnP и NAT-PMP. Например, одна библиотека здесь.

В-третьих, используйте IPv6. Teredo, который является одним из способов запуска IPv6 по протоколу IPv4, часто работает, когда ничего из этого не происходит, и кто знает, что ваши пользователи могут работать с IPv6 другими способами. Очень маленький код для реализации этого и все более важный. Например, примерно половина данных Bittorrent поступает на IPv6, например.