gpt4 book ai didi

ios - 无法在iOS UDP套接字中获取数据回调

转载 作者:行者123 更新时间:2023-12-03 12:08:58 27 4
gpt4 key购买 nike

我正在尝试在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应用程序向UDP地址发送UDP数据报)。

我究竟做错了什么?

感谢您的协助!
干杯。

最佳答案

问题在于CFSocket本身并不启用接收发送到IPv4(或IPv6)多播地址的数据报的功能。但是,一切并非没有希望!

https://justanapplication.wordpress.com/category/posix/posix-system-calls/posix-socket/,我发现了这一点:“幸运的是,函数CFSocketCreateWithNative可以将理论上的POSIX套接字转换为理论上的CFSocket。”该书的作者西蒙·刘易斯(Simon Lewis)也说,“至少在运行iOS 7.0.4的iPad上,”这实际上也是可行的,并且他很乐于提供一些代码来进行尝试。祝你好运!

关于ios - 无法在iOS UDP套接字中获取数据回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46284562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com