1

我正在尝试在 iOS 上设置一个 UDP 套接字来监听来自多播套接字的数据报:

#import <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void getSocketDataCallBack (CFSocketRef cfSocketRef, CFSocketCallBackType cbType, CFDataRef address, const void *data, void *info) {
    if (cbType == kCFSocketDataCallBack) {
        cout << "o";
    } else {
        cout << "x";
    }
}


void main () {
    CFSocketError cfErr;
    CFSocketContext udpSocketContext = {0, NULL, NULL, NULL, NULL};
    udpSocketContext.info = &cbData;
    CFSocketRef udpSocketRef = CFSocketCreate(kCFAllocatorDefault,
                                              PF_INET,
                                              SOCK_DGRAM,
                                              IPPROTO_UDP,
                                              kCFSocketDataCallBack,
                                              &getSocketDataCallBack,
                                              &udpSocketContext);
    if ( udpSocketRef == NULL) {
        cout << "CFSocketCreate failed\n";
    } else {
        cout << "UDP socket created\n";

        CFRunLoopSourceRef source = CFSocketCreateRunLoopSource( kCFAllocatorDefault, udpSocketRef, 0 );
        CFRunLoopAddSource( CFRunLoopGetMain(), source, kCFRunLoopCommonModes );

        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_len = sizeof(addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(MC_PORT);       //4194
        inet_aton(MC_ADDR, &addr.sin_addr);   //239.0.123.45

        //Tell socket to listen on this address
        CFDataRef cfDataRef = CFDataCreate(NULL, (const UInt8 *)&addr, sizeof(addr));
        cfErr = CFSocketSetAddress(udpSocketRef, cfDataRef);
    }
}

所有套接字调用都成功,但我没有收到任何回调(我正在从单独的 macOS 应用程序向 MC 地址发送 UDP 数据报)。

我究竟做错了什么?

感谢您的所有帮助!干杯。

4

1 回答 1

0

问题是 CFSocket 本身不能接收发送到 IPv4(也不是 IPv6)多播地址的数据报。但一切并非毫无希望!

https://justanapplication.wordpress.com/category/posix/posix-system-calls/posix-socket/我发现了这个:“幸运的是,CFSocketCreateWithNative 函数可以将理论上的 POSIX 套接字转换为理论上的 CFSocket。” 这篇文章的作者 Simon Lewis 还说这实际上也有效,“至少在运行 iOS 7.0.4 的 iPad 上”,他很乐意提供一些代码来试用它。祝你好运!

于 2017-09-18T21:40:31.803 回答