Как реализовать многоадресные сокеты в Swift?

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

Я использую Perfect (https://github.com/PerfectlySoft/Perfect) для написания сервера стороне, однако не повезло ни с модулем Perfect-Net, ни с CocoaAsyncSocket. Как я могу реализовать отправителя и получателя с помощью Swift? Любой сниппет может быть действительно полезен.

Я читал о многоадресной рассылке, и когда дело доходит до получателя, я заметил, что в большинстве языков (например, java или c#) получатель часто указывает номер порта и многоадресный IP-адрес, но когда соединение с сервер делается? Когда сокет привязывается к реальному ip-адресу сервера?

заранее спасибо


person doguico    schedule 21.11.2017    source источник


Ответы (2)


Если говорить о стеке TCP/IP, то только IP и UDP поддерживают широковещательные и многоадресные рассылки. Они оба без установления соединения, и именно поэтому вы видите только отправку и получение на специальные многоадресные адреса, но не привязываетесь и не подключаетесь. Вы видите это на разных языках, потому что (а) протоколы не зависят от языка и (б) большинство реализаций прилагают разумные усилия, пытаясь быть совместимыми с интерфейсом сокетов BSD.

Если вам нужна настоящая многоадресная рассылка, вам нужно найти быструю реализацию сокетов, позволяющую устанавливать параметры. Обычное название этой операции setsockopt. Стороне отправителя многоадресной рассылки не нужно ничего, кроме базового сокета UDP (я предлагаю использовать UDP, а не IP), в то время как отправитель необходимо добавить в группу многоадресной рассылки. Этот пример Python в значительной степени описывает это.

Однако стоит отметить, что маршрутизаторы не маршрутизируют широковещательные и многоадресные рассылки. Следовательно, вы не можете использовать его через Интернет. Если вам нужно использовать Интернет в своем проекте, я бы посоветовал вам использовать TCP - или веб-сокеты, если ваши клиенты - браузеры, - и отправлять сообщения «группам» из них вручную.

person u354356007    schedule 21.11.2017

Я предполагаю, что вы на самом деле хотите Perfect-Kafka или Perfect-Mosquitto - очередь сообщений, которая позволяет серверу публиковать прямые трансляции для подписчиков на стороне клиента. Сокеты низкого уровня не будут легко выполнять ваши требования.

person PerfectlyRock    schedule 23.11.2017