在IOS上使用CFSocket进行UDP广播

已经做了一些谷歌search和一些在这个问题上的阅读,但似乎无法得到它正确无论多less时间,我花了search。

我想要做的就是通过宣传我们对他们提供的服务的兴趣来接收在我的networking上连接的设备的广播消息。 使用wireshark我可以看到来自我想连接的networking设备的广播/通知消息通过我的networking发送,但不是我的广播search他们的服务的兴趣。 但与networking实用程序,我可以看到套接字创build,但不知道它是在哪个状态,无论是听或连接。

是的,我知道有些图书馆可以用来做这件事,但是我想从头开始build立自己的东西,并更好地理解它是如何工作的。

MySocket.h

#import <Foundation/Foundation.h> #import <CoreFoundation/CoreFoundation.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #if TARGET_OS_IPHONE #import <CFNetwork/CFNetwork.h> #endif @interface MySocket : NSObject { NSString* _message; CFSocketRef cfSocket; CFRunLoopSourceRef cfSource; } - (void)listen; @end 

MySocket.m

 #import "MySocket.h" #define MAX_UDP_DATAGRAM_SIZE 65507 @implementation MySocket static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType type, CFDataRef address, const void *data, void *userInfo) { NSLog(@"socketCAllBAck was called"); } - (void)listen { //Enable broadcast to network hosts int yes = 1; int setSockResult = 0; _message = [[NSMutableString alloc ] initWithString: @"M-SEARCH *HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n"]; CFSocketContext socketContext = {0, self, NULL, NULL, NULL}; /* Create the server socket as a UDP IPv4 socket and set a callback */ /* for calls to the socket's lower-level accept() function */ cfSocket = CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketAcceptCallBack | kCFSocketDataCallBack , (CFSocketCallBack)socketCallback, &socketContext); if (cfSocket == NULL) NSLog(@"UDP socket could not be created\n"); /* Re-use local addresses, if they're still in TIME_WAIT */ setSockResult = setsockopt(CFSocketGetNative(cfSocket), SOL_SOCKET, SO_BROADCAST, (void *)&yes, sizeof(yes)); if(setSockResult < 0) NSLog(@"Could not setsockopt for broabcast"); /* Set the port and address we want to listen on */ struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("239.255.255.250"); //inet_pton(AF_INET, "239.255.255.250", &(addr.sin_addr)); addr.sin_port = htons(1900); //addr.sin_addr.s_addr = htonl(INADDR_ANY); NSData *address = [ NSData dataWithBytes: &addr length: sizeof(addr) ]; if (address != nil && CFSocketSetAddress(cfSocket, (CFDataRef) address) != kCFSocketSuccess) { NSLog(@"CFSocketSetAddress() failed\n"); CFRelease(cfSocket); } CFDataRef data = CFDataCreate(NULL, (const UInt8*)[_message UTF8String], [_message lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); setSockResult = CFSocketSendData(cfSocket, (CFDataRef)address, data, 0.0); if(kCFSocketSuccess != setSockResult) NSLog(@"Unable to send data, %i", setSockResult); else NSLog(@"Sending data"); cfSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, 0); if(cfSource == NULL) NSLog(@"CFRunLoopSourceRef is null"); CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode); NSLog(@"Socket listening on port 1900"); CFRelease(cfSource); CFRelease(cfSocket); [address release]; data = nil; CFRunLoopRun(); } - (void)dealloc { CFRunLoopRemoveSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode); CFRelease(cfSource); CFRelease(cfSocket); [_message release]; [super dealloc]; } @end 

编辑:一切运行良好,直到调用发送数据。

有一些小的,但重要的是为了这个工作,我失踪了? 或者我错过了大的图片?

任何帮助或指导表示赞赏。 提前致谢,祝你周末愉快

删除SetAdress和所有将正常工作。 我现在testing过了;

如何使用此地址的初始化

 CFDataRef address=CFDataCreate(kCFAllocatorDefault,(UInt8 *)&addr,sizeof(addr));