Как создать пару NSInputStream/NSOutputStream, приняв сокет сервера?

Я знаю, что вы можете создать NSInputStream а также NSOutputStream пара (бесплатный звонок соединен с CFReadStream, CFWriteStream), открыв TCP-соединение клиента, используя CFStreamCreatePairWithSocketToHost в соответствии с Руководством по программированию потока.

Как создать TCP- сервер, который прослушивает порт и принимает соединение как NSInputStream а также NSOutputStream пара?

2 ответа

Решение

Пример проекта RemoteCurrency предоставляет пример этого в QServer.m (ранее известный как TCPServer.m). Пример кода на самом деле предназначен для настройки рекламы Bonjour, но эта часть может быть исключена для простого TCP-сервера.

Вы создаете сокет с вашим собственным обратным вызовом, вызывая CFSocketCreate, связать и прослушать порт, позвонив CFSocketSetAddress и начать получать ответные вызовы, позвонив CFSocketCreateRunLoopSource с последующим CFRunLoopAddSource,

Затем в обратном вызове принятия вы создаете NSInputStream / NSOutputStream пара из ручки подключения с помощью CFStreamCreatePairWithSocket, установите делегат входного потока и начните получать обратные вызовы recv, вызывая scheduleInRunLoop:forMode:, а потом open оба потока, чтобы начать использовать их.

Использование абстракций NSInputStream и NSOutputStream (в отличие от создания нового потока и вызова стандартных функций UNIX socket, bind, listen, accept, send, recv) позволяет легко получать сетевые события в том же NSRunLoop, что и остальные API на основе цикла выполнения в OSX.

У меня есть пример приложения, которое вы можете скачать, который создает пару NSStreams, подключенных через сокет. Затем он передает потоковое видео в режиме реального времени через разъемы с помощью камеры на устройстве iOS:

Код является лаконичным и простым в использовании (игнорируйте дополнительные файлы в проекте; NavController.h/m и PeerConnectionViewController.h/m и CameraViewController.h/m являются единственными тремя соответствующими файлами):

https://app.box.com/s/fnim5ril4mzu518wj98zy3ah8l83jayv

Другие вопросы по тегам