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

标签 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!");
       } 

最佳答案

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

我没有更改的链接/引用,因为它是我的硬盘上存储了几天大量谷歌搜索的一些代码。

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

关于objective-c - 如果不是主机 IP,CFSocketSetAddress 会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811342/

相关文章:

python - 如何通过OpenCV处理VLC UDP流

ios - 从 Objective C 中的文件中读取字节数组

ios - 归档 NSMutableArray

c - 创建服务器/客户端 TCP/IP 程序时遇到问题

在c中为linux创建一个新线程?

linux - 为什么UDP数据包是从默认接口(interface)地址发送的,而不是从接收客户端数据包的地址发送的?

ios - 限制用户只能输入七个逗号分隔的单词

objective-c - 如何获得 Mac 音频电平?

C# TCP Async EndReceive() 仅在 Windows XP 32 位上抛出 InvalidOperationException

java - 不能与 BufferedInputStream 和 BufferedReader 一起使用