Устройства iOS не получают многоадресную рассылку UDP с помощью GDAsyncUdpSocket

Приведенный ниже код предназначен для получения многоадресных сообщений UDP на 239.255.255.250 и просто NSLog содержимого сообщения.

Если я отправляю сообщение на IP-адрес устройства iOS (то есть с терминала echo foo | nc -u 10.1.10.249 1900), сообщение получено и NSLog'd.

Однако, если я транслирую сообщение на многоадресный адрес (echo bar | nc -u 239.255.255.250 1900), сообщение не получено.

При запуске сообщения об ошибках не регистрируются.

Мысли о том, где я ошибаюсь?

#import "ViewController.h"
#import "GCDAsyncUdpSocket.h"

@interface ViewController () {
    GCDAsyncUdpSocket *udpSocket;
}
@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;

    if (![udpSocket bindToPort:1900 error:&error]) {
        NSLog(@"Error starting server (bind): %@", error.description );
        return;
    }

    if(![udpSocket joinMulticastGroup:@"239.255.255.250" error:&error] ) { //]onInterface:@"en0" error:&error]) {
        NSLog(@"Error joining multicast group: %@",error.description);
        return;
    }

    if (![udpSocket beginReceiving:&error]) {
        [udpSocket close];
        NSLog(@"Error starting server (recv): %@", error.description);
        return;
    }

    NSLog(@"Udp server started on port %@:%hu", [udpSocket localHost_IPv4], [udpSocket localPort]);
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext {
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"message rec'd: %@:%hu %@\n", [udpSocket localHost_IPv4], [udpSocket localPort],msg);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

person TomH    schedule 24.06.2014    source источник
comment
Сэр, вы нашли решение для этого?   -  person Anoop    schedule 06.07.2015


Ответы (1)


Вам не хватает ключевой функции, которая на какое-то время ставила меня в тупик.

[udpSocket enableBroadcast:YES error:&error];

Это позволит вам отправлять широковещательные пакеты и получать широковещательные пакеты от вашей многоадресной группы.

person Charles Maria    schedule 16.07.2014
comment
Эй, это работает для меня, если в случае того же Wi-Fi. Но есть ли какое-нибудь решение, если мы включим нашу точку доступа? - person Anoop; 06.07.2015
comment
Я не знаю, как заставить эту работу работать при использовании телефона в качестве точки доступа, это связано с базовой сетевой моделью, которая намеренно отделяется от сети точки доступа. - person Charles Maria; 07.07.2015