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

9

我完全是网络新手,但我是一名c / c ++程序员,目前正在使用objective-c编程(这是针对OSX / iPhone的)。

我正在尝试学习如何使用cfsocket发送UDP奇妙数据包。我看到有像AsyncUDPSocket库这样的库,但我不想使用这些库。

我尝试查看苹果的UDPecho文件,但作为初学者,它使我感到困惑。我在Google上搜索了很多,然后组合了下面的代码。我运行了数据包嗅探器,但没有注册任何被发送的内容。我知道我的代码缺少很多错误处理,但我只是想先掌握基础知识。

这段代码正确吗?(如果我的问题不太清楚,那就抱歉了)我的意思是是否缺少某些代码阶段,例如: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;
}
2个回答

7
你的问题很简单:你没有告诉CFSocket你想将数据发送到哪里。
你仔细构造了一个地址在addr中,但是却没有使用它。你需要调用CFSocketSetAddress来设置套接字的目标地址(如果你希望发送的所有数据包都发往相同的目标地址),或者将地址作为第二个参数传递给CFSocketSendData函数。

嗨,谢谢,我会尝试的...抱歉回复晚了,很忙! - Alex
嗨David,感谢您的回复,我刚刚尝试输入以下内容:'CFSocketSetAddress (WOLsocket, addr);'但是出现了参数类型不兼容的错误,我从这里得到了相同的东西;'CFSocketSendData(WOLsocket, addr, Data, 0);'我是否不应该使用'addr'而是其他东西? - Alex
“不兼容类型”错误是因为CFSocketSendData期望地址被传递为CFData,而不是struct inaddr。 - David Gelhar
我四处查阅,发现了这一点,有些着急地提出了问题。感谢你的帮助,David。我正在逐步进展! - Alex

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接