如果不是主机IP,CFSocketSetAddress会失败吗?

时间:2011-07-25 02:43:41

标签: objective-c sockets udp ip cfsocket

我正在制作一个简单的WOL应用程序。 到目前为止,我可以成功创建一个套接字,但是当使用CFSocketSetAddress设置地址时,我只能使用我的计算机的网络IP(WiFi ip = 192.168.0.5)或本地IP(127.0.0.1)。

对于WOL,我想将数据发送到广播地址(255.255.255.255)。如果输入,我将返回错误“地址无法设置”。

我想念 - 理解CFSocketSetAddress的使用,地址应该是主机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!");
       } 

2 个答案:

答案 0 :(得分:3)

我通过使用不同的方法(获得本机套接字)解决了我的问题,然后我在CFSocketSendData的第二个参数中传递了地址,而不是使用CFSocketSetAddress。

我没有这些更改的链接/参考,因为从谷歌搜索的日子开始,我的硬盘上存储了一些代码。

感谢David Gelhar,我指出了我之前question的正确方向。

对于其他可能需要此功能的人来说,这是我的代码;

//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");
    }

答案 1 :(得分:2)

对于我的应用,问题是它是沙盒,但没有网络权限。

如果您使用的是App Sandbox,则需要检查其中一个:

The App Sandbox section of a project's settings, with 'Incoming Connections (Server)' checked