Как прослушать определенный порт на iPhone ios4.2? - PullRequest
0 голосов
/ 16 февраля 2011

Я схожу с ума от моего настоящего проекта ...

У меня есть устройство, которое отправляет данные на определенный порт. Моя цель - обнаружить все устройства такого типа на этом порту. Пример: у меня есть 4 устройства такого типа в одной сети, и я бы с помощью iPhone обнаружил все это устройство.

Он работает с инструментом обнаружения JAVA, и сейчас я пытаюсь сделать это на своем iPhone.

В инструменте обнаружения JAVA используются следующие шаги:

  • Создание DatagramSocket (JAVA)
  • Получить широковещательный адрес (255.255.255.255)
  • Создание DatagramPacket (JAVA)
  • Отправка пакета на широковещательный адрес с портом 30303
  • Перейти в режим приема
  • Из-за сокета он получает пакеты ответов
  • Извлеките ip и имя хоста из устройства

Я попытался повторить те же шаги с помощью класса AsyncUdpSocket: http://code.google.com/p/cocoaasyncsocket/

А вот код, который я пробовал до сих пор:

NSError *e;
NSString *d = @"abcd";
NSData *data = [d dataUsingEncoding:NSUTF8StringEncoding];


ssocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
[ssocket setDelegate:self];



[ssocket enableBroadcast:YES error:&e];


[ssocket connectToHost:@"255.255.255.255" onPort:30303 error:&e];


[ssocket sendData:data withTimeout:-1 tag:0];

[ssocket receiveWithTimeout:-1 tag:0];

Делегат - (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port никогда не вызывается ...

Я не знаю, что не так. Не могли бы вы дать мне свое мнение по этому вопросу? Если я использую правильную методологию и посмотрим, сделал ли я что-то не так?

Заранее спасибо !!

MoKeS

РЕДАКТИРОВАТЬ:

Я использовал wireshark для перехвата сетевого трафика с помощью JavaDiscoverTool и моего приложения. На самом деле разница между двумя пакетами (iphone и javadiscovertool) - это порт источника. Действительно, в моем приложении порт источника отличается от порта назначения, и я думаю, что это вызывает проблему. Мне нужно найти способ заставить порт источника на отправляемом пакете ...

Есть идеи? Он находится в классе AsyncUdpSocket.

1 Ответ

0 голосов
/ 17 февраля 2011

Я нашел решение.

Использование:

NSError *e;
NSString *d = @"Discovery: Who is out there?\0\n";
NSData *data = [d dataUsingEncoding:NSUTF8StringEncoding];


ssocket = [[AsyncUdpSocket alloc]initWithDelegate:self];
[ssocket setDelegate:self];

[ssocket bindToPort:PORT error:&e];

[ssocket enableBroadcast:YES error:&e];


//[ssocket connectToHost:@"255.255.255.255" onPort:30303 error:&e];


//[ssocket sendData:data withTimeout:-1 tag:0];

[ssocket sendData:data toHost:@"255.255.255.255" port:30303 withTimeout:-1 tag:0];


[ssocket receiveWithTimeout:-1 tag:0];

И делегат:

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
    NSString* aStr;

    aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];


    NSLog(@"didreceivedata : %@", aStr);

    return NO;


}
...