2017-09-18 3 views
1

私はマルチキャストソケットの上に来てデータグラムをリッスンするためのiOS上のUDPソケットを設定しようとしている:は、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データグラムを送信しています)。

私は間違っていますか?

ありがとうございました! 乾杯。

答えて

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の場合でも実際に動作すると述べています。彼はそれを試してみるためにいくつかのコードを用意しています。がんばろう!

関連する問題