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

如何通过UDP CFSocket发送数据包?,c,cocoa,sockets,udp,C,Cocoa,Sockets,Udp,我是一个完全的网络新手,但是我是一个c/c++程序员,并且在objective-c中工作(这是针对OSX/iPhone的) 我正在尝试学习如何使用cfsocket发送带有UDP套接字的神奇数据包。我见过一些库,比如AsyncUDPSocket库,但是我不想使用这些库 我试图查看苹果的UDPecho文件,但作为一个初学者,它确实让我感到困惑。我在谷歌上搜索了很多,我把下面的代码放在一起,我有一个正在运行的包嗅探器,它没有注册任何正在发送的东西。我知道我的代码缺少很多错误捕捉,但我只是想先了解一些基

我是一个完全的网络新手,但是我是一个c/c++程序员,并且在objective-c中工作(这是针对OSX/iPhone的)

我正在尝试学习如何使用cfsocket发送带有UDP套接字的神奇数据包。我见过一些库,比如AsyncUDPSocket库,但是我不想使用这些库

我试图查看苹果的UDPecho文件,但作为一个初学者,它确实让我感到困惑。我在谷歌上搜索了很多,我把下面的代码放在一起,我有一个正在运行的包嗅探器,它没有注册任何正在发送的东西。我知道我的代码缺少很多错误捕捉,但我只是想先了解一些基本知识

这个代码对吗?(如果这不明确,请道歉)我的意思是我是否遗漏了代码的某些阶段,例如: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

这是我两个整晚的第一个工作代码位!希望你能帮助别人!我想我应该和你分享,也许可以帮你省点麻烦

我禁用了监听呼叫,因为我只想发送数据

+ (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];
    });

}
+(无效)广播
{
int socketSD=插座(PF INET、SOCK DGRAM、IPPROTO UDP);

如果(socketSD Hi,谢谢,我会试试的…很抱歉,回复晚了v busy!你好David,谢谢你的回复,我刚刚尝试输入了以下内容;'CFSocketSetAddress(WOLsocket,addr);'但是被赋予了不兼容类型的错误参数,我从中得到了相同的结果;'CFSocketSendData(WOLsocket,addr,Data,0)我是否应该使用“addr”和其他什么?之所以出现“不兼容类型”错误,是因为CFSocketSendData希望将地址作为CFData传递,而不是作为inaddr的结构传递。是的,我环顾了一下,发现了这一点,问得有点快。谢谢你的帮助david。我马上就到了!