【问题标题】:How to send UDP broadcast packets through all interfaces in Objective-C / OS X 10.8 (DHCP)如何通过 Objective-C / OS X 10.8 (DHCP) 中的所有接口发送 UDP 广播数据包
【发布时间】:2012-10-10 07:27:19
【问题描述】:

我正在创建一个小型实用程序,它必须在我的 MacBook Pro 上通过 BOOTP 提供 IP 地址和参数。

我使用了来自 GitHub 的 AsyncUdpSocket 库(感谢 RobbieHanson),当我将我的机器配置为仅连接有线以太网(Airport Off)时,它就可以工作了。但是,一旦我也启用了我的 Wifi,所有的广播回复都会进入 Wifi 界面。这会导致有线客户端无法得到应答。

初始化/接收代码:

if (![socket bindToAddress:@"0.0.0.0" port:67 error:&err])
    NSLog(@"Error: unable to bind (%@)", [err localizedDescription]);
[socket enableBroadcast:YES error:&err];
[socket receiveWithTimeout:-1 tag:0];

发送代码:

[sock sendData:packetData toHost:@"255.255.255.255" port:68 withTimeout:-1 tag:0];

我确信一定有办法做到这一点,但这是我的第一个 OS X 程序,我正在努力掌握我的谷歌搜索礼仪以适应框架:)

更新

我今晚弄乱了我的代码,并检查了我调用它时 AsyncUdpSocket 正在做什么。基本上我有以下情况;如果我打电话给bindToAddress 并提供10.0.0.1(分配给我的ETH NIC 的地址),那么我既不会收到任何数据包,也无法发送它们。但是,如果我将 nil 传递给方法,那么我可以发送消息并接收广播 - 缺点是发送通过我的 WIFI NIC(默认路由)发出

在后台 - AsyncUdpSocket 库在提供 nil 值时使用 IFADDR_ANY 调用 CFSocketSetAddress,如果提供了 10.0.0.1 的填充 IFADDR 结构。不会引发任何错误,因此应该可以正常工作。

有什么想法吗?我正在上墙,只想解决这个问题。我真的很喜欢这个库的异步特性,所以我不想把它扔掉。

【问题讨论】:

    标签: objective-c macos networking broadcast bootp


    【解决方案1】:

    我认为你必须这样做

    1. 获取您机器上所有网络接口的列表,
    2. 为每个接口创建一个套接字并将其绑定到接口地址。
    3. 在所有套接字上发送/接收,每个接口一个。

    第 1 部分可以例如使用getifaddrs() 完成(在终端中输入“man getifaddrs”)。不知道CoreFoundation中是否也有比较好用的功能。

    【讨论】:

    • 我只需要将数据包绑定到单个接口 - 我可以让用户选择他们将使用的接口。如果我这样做,大概我只是调用CFSetSocketAddress() 方法来强制广播到该接口下的 255.255.255.255?
    • @richbayliss:如果将数据包发送到特定接口的广播地址会怎样?例如 10.255.255.255 用于 10.0.0.1 接口。
    • 这会在绑定到 ANY 地址时将数据包发送到正确的接口。它确实将目的地发送到 10.255.255.255,在我的情况下似乎工作正常,但端点正在寻找 255.255.255.255 的情况呢?
    • @richbayliss:据我了解,如果您向 10.255.255.255 发送了一个数据包,那么该数据包会被 该网络上列出到 255.255.255.255 的所有客户端接收。另请参阅 stackoverflow.com/questions/2267538/… ,其中还建议为每个接口绑定单独的套接字。
    • 我同意多接口绑定方法 - 但是在我的机器(MacBook Pro Retina w/10.8)上似乎完全破坏了我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 2010-10-15
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多