我是网络的全新手,但我是一名c / 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;
}
答案 0 :(得分:7)
您的问题很简单:您没有告诉CFSocket您希望它在哪里发送数据。
您在addr
中仔细构建了一个地址,但之后不要使用它。您需要调用CFSocketSetAddress
来设置套接字上的目标地址(如果您希望发送的所有数据包都转到同一目的地),或者将该地址作为第二个参数传递给CFSocketSendData
。 / p>
答案 1 :(得分:0)
这是我整整两夜的第一个代码!希望能帮助别人!以为我应该分享它,可能会让某人有点麻烦。
我禁用了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];
});
}