【问题标题】:GCDasyncUdpSocket and wifi InterfaceGCDasyncUdpSocket 和 wifi 接口
【发布时间】:2012-08-13 14:22:17
【问题描述】:

en0 似乎是 Apple iOS 设备的 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");
}
}

问候

【问题讨论】:

  • 代码太少,看不到任何东西。 en0 确实是wifi接口。您应该展示委托方法的作用,以及 mcastSocket 的创建。
  • socketError中的详细信息是什么?
  • 嗨 DarthMike,我已经添加了 mcastSocket 创建。如果您不指定接口,代码可以正常工作。
  • Joe 参见上面的 soketError 定义

标签: iphone objective-c cocoa cocoaasyncsocket


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多