CocoaAsyncSocket и True iOS Peer-to-Peer передача файлов через параметр includePeerToPeer NSNetService.

Я пытаюсь создать приложение, которое имеет возможность передавать большие файлы между устройствами iOS через то, что я назову «настоящей» одноранговой сетью, т.е. два устройства, подключенные напрямую друг к другу без промежуточного маршрутизатора/Wi-Fi. фай сеть. Я определил, что у меня есть три варианта высокого уровня:

1) Библиотека Apple Multipeer Connectivity, которая позволяет обнаруживать другие близлежащие устройства, а также включает в себя возможность отправлять то, что Apple использует в качестве «ресурсов», также известных как файлы. Мое прототипирование показало, что этот фреймворк ужасно отправляет большие файлы (200 МБ+). Скорость редко превышала 200 КБ/с и была ненадежной. Самая высокая скорость, которую я когда-либо видел, была около 1 МБ/с. Опыт других людей, кажется, отражает мой из того, что я видел в Интернете.

2) Служба обнаружения NSNetService в дополнение к ее способности легко захватывать NSInputStream и NSOutputStream. Использование этого в сочетании со свойством NSNetServices includePeerToPeer позволяет мне легко и быстро подключаться к устройствам «настоящим» одноранговым способом и отправлять данные по сети, используя эти потоки. Это было бы здорово, но работа с входными и выходными потоками исключительно сложна, потому что мне нужно упаковать данные заголовка (имя входящего файла, размер, местоположение и т. д.) в поток. У меня это работает на практике, но мне не нравится моя реализация, и я чувствую, что не могу охватить все свои основы. В каком-то смысле я чувствую, что заново изобретаю велосипед.

3) В моем идеальном решении использовалась бы способность NSNetService обнаруживать одноранговые узлы и подключаться к ним, как это делает последнее решение, но было бы реализовано CocoaAsyncSockets для обработки фактической передачи файлов, что позволило бы мне использовать установленную библиотеку с проверенным послужным списком, которая также позволяет мне уйти. из мельчайших деталей использования NSInputStream и NSOutputStream.

Проблема, с которой я столкнулся, заключается в том, что, хотя CocoaAsyncSockets отлично работают, когда устройства подключены к одной и той же сети, они не могут подключаться друг к другу в настоящей одноранговой сети, предположительно потому, что они по понятным причинам не могут видеть друг друга через обычные интерфейсы Ethernet. Похоже, что настоящий одноранговый материал использует интерфейс Apple awdl, который, как я читал на форумах разработчиков, нельзя использовать как обычный интерфейс (я пытался указать этот интерфейс при подключении к сокету, он не работает).

Я знаю, что это довольно расплывчато, но у кого-нибудь есть предложения для меня? Один из разработчиков на форумах разработчиков Apple упомянул что-то в связанной теме о создании моих собственных сокетов из сокетов, предоставленных через NSNetService при использовании publishWithOptions:NSNetServiceListenForConnections, но он не предоставил много информации, и я не могу понять, как это должно сработать.


person user3062913    schedule 29.06.2016    source источник
comment
Нашли ли вы какие-либо решения этой проблемы? Я пытаюсь добиться того же самого и иметь те же проблемы с AsyncSockets при прямом подключении.   -  person Daniel    schedule 24.04.2018
comment
В итоге мне пришлось пойти по сложному пути и реализовать свои собственные сообщения через NSInputStream и NSOutputStream, как описано в варианте 2. Я никогда не мог заставить CocoaAsyncSockets работать для этого единственного пограничного случая. Хотя прошло уже 2 года. Стала ли библиотека многопользовательского подключения Apple лучше, чем раньше? Может быть, вы можете просто использовать это. Я не работал над iOS вскоре после того, как написал этот пост.   -  person user3062913    schedule 25.04.2018
comment
Я попробовал Multipeer Connectivity, но когда дело доходит до больших файлов и надежности, это просто катастрофа. Я пытаюсь переместить файлы размером от 1 до 300 МБ. NSNetService и CocoaAsyncSockets прекрасно работают вместе, если у нас есть точка доступа, и это очень быстро. Так что, вероятно, мне нужно будет придумать собственное решение для обработки NSInputStreams. Если у вас есть какой-либо фрагмент кода, которым вы можете поделиться со мной, просто чтобы направить меня в правильном направлении, я был бы очень признателен. Спасибо   -  person Daniel    schedule 25.04.2018
comment
Я бы с удовольствием поделился некоторым кодом, но, к сожалению, я больше не работаю в компании, где я написал код, который сделал это! Основное резюме, насколько я помню, заключалось в том, что я следовал инструкциям, которые вы увидите в Интернете, для открытия входных и выходных потоков, затем я просто скомпилировал очень простой заголовок в первый отправленный пакет, который указывал полный размер файла и переслал. Принимающая сторона будет анализировать размер заголовка и просто подсчитывать полученные байты и объявлять полученный файл, когда полученные байты = байтам заголовка.   -  person user3062913    schedule 25.04.2018
comment
Кроме того, проверьте этот другой вопрос Примерно в то же время я попросил некоторый код и немного больше информации. Вывод из этого потока заключается в том, что вам необходимо отправлять пакеты поддержки активности через сокет, если вы планируете бездействовать в течение значительного периода времени, иначе сокет автоматически отключится. Мое приложение работало взад и вперед с промежуточной обработкой, поэтому мне это было необходимо, но если вы делаете один файл за один раз, вам не о чем беспокоиться.   -  person user3062913    schedule 25.04.2018
comment
Спасибо за идеи, я попытаюсь придумать что-нибудь, но это было полезно для начала!   -  person Daniel    schedule 26.04.2018