Я пытаюсь создать приложение, которое имеет возможность передавать большие файлы между устройствами 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
, но он не предоставил много информации, и я не могу понять, как это должно сработать.