【问题标题】:GCDAsyncsocket broadcast to all IPsGCDAsyncsocket 向所有 IP 广播
【发布时间】:2013-12-15 23:06:07
【问题描述】:

我正在尝试为微芯片平台实现 IP 发现器应用程序。我正在使用GCDAsyncSocket 来执行此操作。如果我发送特定消息,所有感兴趣的设备都将使用其网络凭据进行响应。

使用 GCDAsyncSocket,如果我使用特定的 IP,我可以得到响应。但我不确定如何将此消息广播到网络中的所有 IP。

我的代码: udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

- (void)setupSocket
{   
    NSError *error = nil;


    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:FORMAT(@"Error binding: %@", error)];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:FORMAT(@"Error receiving: %@", error)];
        return;
    }
    [udpSocket enableBroadcast:YES error:&error];
    if (error != nil)
    {
        NSLog(@"Error enableing broadcast: %@", [error description]);
        return;
    }

    [self logInfo:@"Ready"];
}

- (IBAction)send:(id)sender
{
    NSString *host = addrField.text;
    NSError *error = nil;


    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    [udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:tag];


    [self logMessage:FORMAT(@"SENT (%i): %@", (int)tag, msg)];

    tag++;
}

现在,我怎样才能让它发送到所有 IP 而不是只发送到一个 IP?在原始的 PC java 应用程序中,我可以看到类似

socket = new DatagramSocket(30303);
            socket.setBroadcast(true);
            InetAddress address = InetAddress.getByName("255.255.255.255");
            packet = new DatagramPacket(str.getBytes(),
                    str.length(), address, 30303);

            socket.send(packet);

我想在这个应用程序上做同样的事情。感谢您的帮助。

【问题讨论】:

  • 您的主机价值是多少?应该是255.255.255.255吗?
  • 嗯,有多个主机地址。我想向所有人广播,以便所有识别消息的硬件单元都会响应。我通过 iphone 模拟器发送 udp 的笔记本电脑是 192.168.2.1。然后有多个设备,例如 192.168.2.3、2.34、2.101 等,我想得到响应。目前,如果我指定一个主机地址(比如 192.168.2.34),我可以得到响应。
  • 我的评论基于您给定的 java 代码,该代码向 255.255.255.255 发送了一条消息。向该地址发送 UDP 数据报,将消息传递到本地网段上的任何主机。
  • 如果我使用 255.255.255.255 作为主机地址,那么我没有得到响应。

标签: java ios gcdasyncsocket


【解决方案1】:

我在我的 ios 应用程序中使用了相同的套接字库用于相同的目的(在网络上搜索设备) 我使用的代码是..

_broadcastSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
if ([_broadcastSocket enableBroadcast:YES error:&error] == false) {
        NSLog(@"Failed to enable broadcast, Reason : %@",[error userInfo]);
    }
[_broadcastSocket sendData:data toHost:@"255.255.255.255" port:5944 withTimeout:-1 tag:5];

使用 NSData 对象调用 socket 的 sendata 函数会将数据广播到网络上侦听给定端口的所有 ip。

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 2013-06-13
    • 2019-03-08
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多