我正在创建一个小型实用程序,它必须在我的 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
不会引发任何错误,因此应该可以正常工作。
有任何想法吗?我要上墙,只想解决这个问题。我真的很喜欢图书馆的异步性质,所以我不想把它扔掉。