2

en0はAppleiOSデバイスのwifiインターフェイスのようですが、私のコードでは、インターフェイスen0を指定すると、小さなマルチキャストクライアントが何も受信しません。何が間違っているのかについての手がかりはありますか?GDCasyncUdpSocketログにエラーが表示されない=>ソケットをポート(1234)インターフェイスにバインド((en0))

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    //log test
    [DDLog addLogger:[DDTTYLogger sharedInstance]];

    // Create multicast High Priotity queue
    mcastQueue = dispatch_queue_create("mcastQueue", NULL);
    dispatch_queue_t high = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    dispatch_set_target_queue(mcastQueue, high);

    // Create UDP Socket
    mcastSocket=[[GCDAsyncUdpSocket alloc] initWithDelegate:self     delegateQueue:mcastQueue];

    [mcastSocket setPreferIPv4];
    return self;
}

- (void)viewDidLoad {
[super viewDidLoad];

  NSError *socketError=nil;

if (![mcastSocket bindToPort:1234 interface:@"en0" error:&socketError]) {
    NSLog(@"Failed binding socket to port: %@" ,socketError);
    return;
}

if (![mcastSocket enableBroadcast:YES error:&socketError]) {
    NSLog(@"Failed enabling broadcast: %@" ,socketError);
    return;
}

if (![mcastSocket joinMulticastGroup:@"239.0.0.1" error:&socketError]) {
    NSLog(@"Failed joining multicast group: %@" ,socketError);
    return;
}

//start receiving multicast data
if (![mcastSocket beginReceiving:&socketError]) {
    [mcastSocket close];
    NSLog(@"Failed to start receiving: %@" ,socketError);

} else {
    NSLog(@"Multicast start receiving");
}
}

よろしく

4

1 に答える 1

2

これを断続的に解決しようとして諦めた1年ほど後、私はついにこれに対する答えであると私が信じていることを発見しました。

答えは、UDPパケットを受信するときにインターフェイスにバインドしないようにすることです。https://stackoverflow.com/a/10739443/179216を参照)

代わりに、マルチキャストグループに参加するときにインターフェイスを指定する必要があります。

// Do *not* specify the interface here
if (![mcastSocket bindToPort:1234 error:&socketError]) {
    NSLog(@"Failed binding socket to port: %@" ,socketError);
    return;
}

if (![mcastSocket enableBroadcast:YES error:&socketError]) {
    NSLog(@"Failed enabling broadcast: %@" ,socketError);
    return;
}

// This is where you specify the interface
if (![mcastSocket joinMulticastGroup:@"239.0.0.1" onInterface:@"en0" error:&socketError]) {
    NSLog(@"Failed joining multicast group: %@" ,socketError);
    return;
}
于 2016-03-23T23:26:10.123 に答える