【问题标题】:How to send a packet via a UDP CFSocket?如何通过 UDP CFSocket 发送数据包?
【发布时间】:2011-07-24 03:39:29
【问题描述】:

我完全是网络新手,但我是一名 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;
}

【问题讨论】:

    标签: c cocoa sockets udp


    【解决方案1】:

    你的问题很简单:你没有告诉 CFSocket 你希望它把数据发送到哪里。

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

    【讨论】:

    • 您好,谢谢,我会尝试...抱歉回复晚了 v 忙!
    • 嗨大卫,感谢您的回复,我刚刚尝试输入以下内容; 'CFSocketSetAddress (WOLsocket, addr);'但是被赋予了不兼容类型的错误参数,我从中得到了同样的东西; 'CFSocketSendData(WOLsocket, addr, Data, 0);'我不应该使用'addr'和其他东西吗?
    • “不兼容类型”错误是因为 CFSocketSendData 期望地址作为 CFData 而不是结构 inaddr 传递。
    • 是的,环顾四周,发现了这一点,问得有点快。谢谢你的帮助大卫。我快到了!
    【解决方案2】:

    这是我整整两个晚上的第一个工作代码!希望能帮助别人!以为我应该分享它,可能会为某人省去一些麻烦。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2019-05-01
      • 2011-08-20
      相关资源
      最近更新 更多