Как прослушивать через определенный порт на iPhone ios4.2?
-
14-11-2019 - |
Вопрос
Я схожу с ума по своему настоящему проекту...
У меня есть устройство, которое отправляет данные по определенному порту.Моя цель - обнаружить все подобные устройства на этом порту.Пример :У меня есть 4 таких устройства в одной сети, и я бы с помощью iPhone обнаружил все эти устройства.
Это работает с помощью инструмента JAVA discover, и теперь я пытаюсь сделать это на своем iPhone.
Вот шаги, используемые в инструменте обнаружения JAVA :
- Создайте DatagramSocket (JAVA)
- Получить широковещательный адрес (255.255.255.255)
- Создать пакет данных (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
никогда не вызывается ...
Я не знаю, что не так..Не могли бы вы, пожалуйста, высказать мне свое мнение по этому поводу?Если я использую правильную методологию и посмотрю, не сделал ли я что-нибудь не так??
Заранее благодарю вас!!
Моксы
РЕДАКТИРОВАТЬ :
Я использовал wireshark для перехвата сетевого трафика с помощью JavaDiscoverTool и моего приложения.На самом деле разница между двумя пакетами (iphone и javadiscovertool) заключается в исходном порту.Действительно, в моем приложении порт источника отличается от порта назначения, и я думаю, что это вызывает проблему.Мне нужно найти способ принудительно указать порт источника в пакете, который я отправляю...
Есть какие-нибудь идеи?Это относится к классу AsyncUdpSocket.
Решение
Я нашел решение.
использовать :
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;
}