Как прослушивать сетевой порт в Objective-C

Я пытаюсь создать приложение для iPhone, которое может прослушивать трафик на определенном сетевом порту.

Сервер в моей сети отправляет сообщения (различные сообщения о состоянии для устройств, которые обрабатывает сервер) через определенный порт.

Моя проблема в том, что когда я создаю поток и makePairWithSocket, я блокирую порт для других, которые хотят отправлять сообщения на сервер, поэтому я хочу только слушать трафик на указанном порту, а затем проверять определенные герейдеры, а затем использовать эти сообщения . Я знаю, как установить соединение и поговорить с сервером, используя потоки записи и чтения, но затем я делаю PairWithSocket и блокирую порт для всех других устройств в сети.

У кого-нибудь есть предложения о том, как прослушивать порт в Objective-C без сопряжения с сервером?

Заранее спасибо Даниил


person KungWaz    schedule 02.09.2010    source источник


Ответы (2)


Проверьте CocoaAsyncSocket. Это дает вам хороший и структурированный способ (с делегатами) отправлять и получать данные... также с несколькими клиентами. Документация вполне приличная. ссылка на проект

edit: взгляните на класс AsyncUdpSocket для UDP-соединения без сохранения состояния.

person Felix    schedule 02.09.2010
comment
Я просматривал этот сайт проекта раньше, но я не могу найти ничего, что могло бы сделать это без подключения к серверу и блокировки порта. У вас есть идеи, как обойти это с помощью AsyncSocket? - person KungWaz; 03.09.2010
comment
нашел это: -acceptOnAddress:port:error: Что мне создать, чтобы использовать это? Если у меня есть поток, как он работает? -acceptOnAddress:port:error: Я думаю, это то, что мне нужно, чтобы принимать соединения с определенного хоста на указанный порт, но как мне это реализовать, чтобы я мог слушать его в фоновом режиме? - person KungWaz; 03.09.2010
comment
Сервер может принимать несколько подключений к одному порту. AsyncSocketDelegate сервера имеет метод получения - (void) onSocket: (AsyncSocket *) sock didReadData: (NSData *) data withTag: (long) tag; где параметр sock принадлежит клиенту, отправляющему данные. Вы можете сохранить параметр sock и использовать [sock writeData:] для отправки данных этому конкретному клиенту. Так что порт не заблокирован. Вам не нужно отключать какое-либо соединение. Взгляните на примеры, предоставленные CococaAsyncSocket. - person Felix; 03.09.2010
comment
Где найти примеры? - person KungWaz; 07.09.2010
comment
AsyncSocket *as = [[AsyncSocket alloc] initWithDelegate:self]; NSError *е; if([as acceptOnInterface:IP-порт:ошибка PORT:&e]) NSLog(@Success); еще NSLog(@Fail:%@, e); Общая ошибка CFsocket — это то, что я получаю, когда использую приведенный выше код, разве это не должно работать? Я устанавливаю соединение и настраиваю сокет для прослушивания, еще не устанавливая делагеты, потому что хочу, чтобы соединение работало. - person KungWaz; 07.09.2010

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

person hotpaw2    schedule 02.09.2010
comment
Я думаю, он хочет захватить широковещательный пакет UDP, что можно сделать на уровне API сокета. - person dreamlax; 03.09.2010
comment
Сервер отправит ответ на тот IP-адрес, с которого был отправлен вопрос, поэтому я хочу соединиться и отправить вопрос, затем закрыть соединение и дождаться ответа, адресованного мне. Но если я останусь в паре, сервер не отправит ответ, потому что я блокирую порт, и он будет думать, что я собираюсь отправить больше данных. Можете ли вы принимать звонки без подключения? - person KungWaz; 03.09.2010
comment
Я могу жестко закодировать IP-адрес iPhone на сервере, чтобы он отправлял на этот IP-адрес при изменении статуса. Но как мне принять соединение без сопряжения и блокировки порта? - person KungWaz; 03.09.2010