CFSOCKETETADDRESS如果不主机IP失败?
-
25-10-2019 - |
题
我正在制作一个简单的WOL应用程序。到目前为止,我可以成功创建一个套接字,但是,当使用CFSOCKETETADDRESS设置地址时,我只能使用计算机的网络IP(WiFi IP = 192.168.0.5)或本地IP(127.0.0.0.1)。
对于WOL,我想将数据发送到广播地址(255.255.255.255)。如果输入此内容,我将返回错误“无法设置地址”。
我是否想念CFSOCKETETADDRESS的使用,该地址应该是主机IP或目标IP?无论哪种情况,我都需要做什么,以便我的目的地IP是广播地址?
以下是我的一些代码:
/*************************************************************************/
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT); //port
inet_aton(IP, &addr.sin_addr);//IP is the host network ip: 192.168.0.5
NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];
if (CFSocketSetAddress(WOLsocket, (CFDataRef)address) != kCFSocketSuccess){
NSLog(@"Address could not be set!");
}
解决方案
我通过使用其他方法(获得本机套接字)解决了问题,然后我不使用CFSocketSetAddress,而是在CFSocketSendData的第二个参数中传达了地址。
我没有更改的链接/参考,因为它是从大量谷歌搜索的日子里存储在我的硬盘上的一些代码。
要感谢大卫·盖尔哈尔(David Gelhar 问题.
对于可能需要这个的其他人来说,这是我的代码;
//Gets native & sets options
/*************************************************************************/
int desc = -1;
desc = CFSocketGetNative(WOLsocket);
int yes = 1;
if (setsockopt (desc, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof (yes)) < 0) {
NSLog(@"Set Socket options failed");
return EXIT_FAILURE;
}
//sets address socket - doesn't bind this is done in CFSocketSendData
/*************************************************************************/
unsigned long bcast = 0xffffffff;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT); //port
addr.sin_addr.s_addr = bcast;
NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];
//Sends Data
/*************************************************************************/
char ethadd []= "helloworld";
CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd));
if (CFSocketSendData(WOLsocket, address, Data, 0) < 0){
NSLog(@"Data could not be sent!");
return EXIT_FAILURE;
}
else NSLog(@"Data Sent");
}
其他提示
对于我的应用程序,问题是它是沙盒,但没有获得网络权限。
如果您使用的是App Sandbox,则需要检查其中之一:
不隶属于 StackOverflow