iPhone - одноранговая связь через Интернет - PullRequest
1 голос
/ 14 декабря 2011

Я создаю приложение, которое использует асинхронное сокетное соединение с веб-сервером. Для отправки больших объемов данных я хотел бы соединить два iPhone в одноранговое соединение с помощью асинхронного сокета. Я больше знаком с GCDAsyncSocket, чем с API-интерфейсом для сокетов iOS SDK.

Я сделал нечто подобное, но только внутри локальной сети я бы использовал NSNetService, чтобы опубликовать информацию о присутствии и получить адреса, необходимые из p2p-соединения.

Можете ли вы дать мне подсказку о том, как подключить два iPhone через Интернет с помощью подключения через p2p-сокет?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2013

Я не знаю много о NSNetService, но кажется, что он работает только в локальной сети.Если вы хотите установить p2p-соединение от iphone к другому, у вас всегда будет проблема с несколькими NAT (трансляторами сетевых адресов) на вашем маршруте.Как найти адрес и маршрут к пиру?И как пройти через все брандмауэры и NAT?

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

На самом деле это возможно.Возможно, вы захотите поискать в Google что-нибудь под названием «UDP дырокол» или «TCP дырокол».

Короче говоря, основной подход: если у вас есть что-то вроде сервера ретрансляции, то есть некоторый сервер в Интернете,общедоступный из любой частной локальной сети, подключенной к www.Нет, у вас есть два клиента A и B в (разных) частных локальных сетях, где происходит преобразование сетевых адресов (NAT), которые хотят установить одноранговое соединение.

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

Если теперь A хочет связаться с B, он просит сервер о помощи.Сервер отправит сообщение B, что A хочет связаться с ней, сообщив ей публичный и частный IP и порт A.A возвращает общедоступную и личную информацию B и порт.

Теперь здесь происходит волшебство.Теперь оба клиента отправляют пакеты для одновременного установления соединения с частными и общедоступными адресами другой стороны и, таким образом, помещают целое в свои NAT, чтобы входящие соединения не блокировались.Даже если пакеты для установления соединения одной из сторон будут поступать до того, как будет создано это целое, пакеты другой стороны дойдут до такой степени, что соединение может быть создано.

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

Теперь главный вопрос, как сервер может общаться с одним из клиентов без активного соединения.Ну, в этом случае вы можете использовать «обратное подключение» и «push-уведомления» от Apple.Используйте «push-уведомления» (pn), чтобы сообщить клиенту за NAT, что происходит что-то интересное и что он должен связаться с сервером.После того, как это сделано, соединение активно и может использоваться в описанном ранее порядке.

Я надеюсь, что это поможет некоторым людям, которые решают эту проблему, хотя сообщение довольно старое!

Теперь, если вы найдете это решение полезным и попытаетесь его реализовать, сообщите мне, если вам удалось получить общедоступный IP-адрес и порт соединения сервер-клиент на стороне сервера.Вы также можете ответить на мой вопрос по этому поводу на stackoverflow .

0 голосов
/ 11 апреля 2012

Пожалуйста, укажите, что вы можете использовать GCDAsyncSocket для подключения 2 телефонов, вы можете использовать пример кода из Github.

...