Я пытаюсь создать сокет UDP и отправить данные на широковещательный порт, чтобы я мог получать их на других устройствах в той же сети WiFi. Я рассчитываю IP-адрес широковещательного порта, как указано в принятом ответе здесь а>.
После этого я написал некоторый код подключения, который выглядит следующим образом:
self.udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue() socketQueue:nil];
NSError *error;
[self.udpSocket enableReusePort:YES error:&error];
[self.udpSocket enableBroadcast:YES error:&error];
- (IBAction)sendMessageToBroadcastPort:(id)sender {
[self.udpSocket sendData:[@"Hi" dataUsingEncoding:NSUTF8StringEncoding] toHost:[self getUDPBroadcastAddress] port:5556 withTimeout:-1 tag:1];
}
Мне удается отправить данные, когда вызывается метод делегата didSendData:.
Пожалуйста, помогите мне понять, что мне здесь не хватает.
Спасибо!
ОБНОВЛЕНИЕ: Cpde для получения данных от широковещательного порта:
- (void)listenForPackets
{
dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL);
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dQueue socketQueue:nil];
NSError *error = nil;
if (![udpSocket bindToPort:5556 error:&error]) {
NSLog(@"Error binding: %@",error);//not connecting to host
return;
}
if (![udpSocket beginReceiving:&error]) {
NSLog(@"Error receiving: %@",error);
return;
}
NSLog(@"Socket Ready");
}
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
NSLog(@"RCV: %@", msg);
}
else
{
NSString *host = nil;
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
NSLog(@"Unknown message from : %@:%hu", host, port);
}
}
IP-адрес вещания, который я получаю после расчета, равен 192.168.2.255.
ОБНОВЛЕНИЕ 2::
Сценарий, с которым я сталкиваюсь, действительно отличается и странен. Прием иногда работает, а иногда нет. Когда я установил два приложения, данные не были получены. Только отправка прошла успешно. Я оставил приложения включенными, и через некоторое время приложение начало получать данные. В некоторых случаях он переставал получать через некоторое время или продолжал получать без каких-либо проблем. В чем может быть проблема?
connectToHost
, так как UDP меньше соединения. Вы должны использоватьsendData:toHost:port:withTimeout
- person Paulw11   schedule 01.06.2016