如何通过UDP CFSocket发送数据包?

我是一个完整的网络新手,但我是ac / c ++程序员,我正在使用objective-c(这是针对OSX / iPhone)。

我正在尝试学习如何使用cfsocket发送带有UDP套接字的魔术包。 我已经看到有像AsyncUDPSocket库这样的库,但是我不想使用它们。

我试图查看苹果UDPecho文件,但作为一个初学者它确实让我困惑。 我用Google搜索了ALOT,我把下面的代码放在一起,我有一个数据包嗅探器正在运行,它没有注册任何被发送的内容。 我理解我的代码缺少很多错误捕获,但我只是想先了解基础知识。

这段代码对吗? (道歉,如果这种接缝含糊不清)我的意思是我错过了代码的某些阶段,例如:CFSocketSetAddress?

如果有人知道任何非常好的教程,它会有所帮助。

非常感谢任何帮助,因为我是一个完整的初学者。

谢谢

int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; CFSocketRef WOLsocket; WOLsocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL); if ( socket == NULL) { NSLog(@"CfSocketCreate Failed"); }else{ if( socket ) { NSLog(@"Socket created :)"); struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(9); //port inet_aton("255.255.255.255", &addr.sin_addr); //ip adress char ethadd []= "helloworld"; CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd)); CFSocketSendData(socket,NULL, Data, 0);} } [pool drain]; return 0; } 

您的问题非常简单:您没有告诉CFSocket您希望它在哪里发送数据。

您在addr仔细构造一个地址,但不要使用它。 您需要调用CFSocketSetAddress来设置套接字上的目标地址(如果您希望发送的所有数据包都转到同一目的地),或者将该地址作为第二个参数传递给CFSocketSendData

这是我整整两夜的第一个代码! 希望能帮助别人! 以为我应该分享它,可能会让人有点麻烦。

我禁用了listen调用,因为我只想发送数据。

 + (void)broadCast { int socketSD = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (socketSD <= 0) { NSLog(@"Error: Could not open socket."); return; } // set socket options enable broadcast int broadcastEnable = 1; int ret = setsockopt(socketSD, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); if (ret) { NSLog(@"Error: Could not open set socket to broadcast mode"); close(socketSD); return; } // Configure the port and ip we want to send to struct sockaddr_in broadcastAddr; memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family = AF_INET; inet_pton(AF_INET, "255.255.255.255", &broadcastAddr.sin_addr); broadcastAddr.sin_port = htons(33333); char *request = "message from ios by c"; ret = sendto(socketSD, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr)); if (ret < 0) { NSLog(@"Error: Could not open send broadcast."); close(socketSD); return; } close(socketSD); dispatch_async(dispatch_get_global_queue(0, 0), ^{ //[self listenForPackets]; }); }