Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Objective-C/OS X 10.8(DHCP)中的所有接口发送UDP广播数据包_Objective C_Macos_Networking_Broadcast_Bootp - Fatal编程技术网

如何通过Objective-C/OS X 10.8(DHCP)中的所有接口发送UDP广播数据包

如何通过Objective-C/OS X 10.8(DHCP)中的所有接口发送UDP广播数据包,objective-c,macos,networking,broadcast,bootp,Objective C,Macos,Networking,Broadcast,Bootp,我正在创建一个小实用程序,它必须在我的MacBookPro上通过BOOTP提供IP地址和参数 感谢RobbieHanson,我使用了GitHub的AsyncUdpSocket库,当我的机器配置为只连接有线以太网时,它就可以工作了。但是,一旦我也启用了Wifi,所有广播回复都会进入Wifi接口。这会导致有线客户端得不到响应 初始化/接收代码: 发送代码: 我相信一定有办法做到这一点,但这是我的第一个OS X程序,我正在努力掌握我的谷歌搜索礼仪以适应框架: 更新 今晚我把代码弄乱了,检查了Async

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

感谢RobbieHanson,我使用了GitHub的AsyncUdpSocket库,当我的机器配置为只连接有线以太网时,它就可以工作了。但是,一旦我也启用了Wifi,所有广播回复都会进入Wifi接口。这会导致有线客户端得不到响应

初始化/接收代码:

发送代码:

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

更新

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

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

有什么想法吗?我真想把这件事解决掉。我真的很喜欢这个库的异步特性,所以我不想把它扔掉。

我想你必须这样做

获取计算机上所有网络接口的列表, 对于每个接口,创建一个套接字并将其绑定到接口地址。 在所有套接字上发送/接收,每个接口一个。
例如,第1部分可以通过终端中的GetIFADRS类型man GetIFADRS完成。我不知道CoreFoundation中是否还有一个更易于使用的功能。

我只需要将数据包绑定到一个接口,我可以让用户选择他们将使用的接口。如果我这样做,大概我只是调用CFSetSocketAddress方法,强制该接口下的广播为255.255.255.255?@richbayliss:如果将数据包发送到特定接口的广播地址,会发生什么情况?例如,10.0.0.1接口的10.255.255.255。当绑定到任意地址时,它确实会将数据包发送到正确的接口。但它确实会将目标发送到10.255.255.255,在我的情况下,这似乎可以正常工作,但如果端点正在查找255.255.255.255,该情况会如何?@richbayliss:我的理解是,如果您将数据包发送到10.255.255.255,则该网络上的所有客户端都会接收到该数据包,该数据包的列表为255.255.255.255。另请参阅,其中还建议为每个接口绑定单独的套接字。我同意多接口绑定方法,但在我的机器MacBook Pro Retina w/10.8上,这似乎完全破坏了我的解决方案。
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];