1

我正在创建一个小型实用程序,它必须在我的 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(默认路由)发出

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

有任何想法吗?我要上墙,只想解决这个问题。我真的很喜欢图书馆的异步性质,所以我不想把它扔掉。

4

1 回答 1

0

我认为你必须

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

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

于 2012-10-09T20:29:41.667 回答