【问题标题】:CFSocketSetAddress fails if not host computer IP?如果不是主机 IP,CFSocketSetAddress 会失败?
【发布时间】:2011-10-12 06:50:52
【问题描述】:

我正在制作一个简单的 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!");
       } 

【问题讨论】:

    标签: objective-c sockets udp ip cfsocket


    【解决方案1】:

    我通过使用不同的方法(Got native socket)解决了我的问题,然后我没有使用 CFSocketSetAddress,而是在 CFSocketSendData 的第二个参数中传递了地址。

    我没有更改的链接/参考,因为它是我的 HDD 上存储的一些代码,这些代码是在大量谷歌搜索的日子里存储在我的硬盘上的。

    要感谢 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");
        }
    

    【讨论】:

    • 真的很高兴它有帮助!
    【解决方案2】:

    对于我的应用,问题在于它已被沙盒化,但没有获得网络权限。

    如果您使用的是 App Sandbox,则需要检查以下一项:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2016-04-14
      相关资源
      最近更新 更多