首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过UDP CFSocket发送数据包?

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

Stack Overflow用户
提问于 2011-07-24 11:39:29
回答 2查看 7.9K关注 0票数 8

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

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

我试图查看苹果的UDPecho文件,但作为一个初学者,它确实把我搞糊涂了。我用谷歌搜索了很多次,我把下面的代码组合在一起,我有一个包嗅探器在运行,它没有注册任何发送的东西。我知道我的代码遗漏了很多错误捕获,但是我只是想先得到一些基础知识。

这段代码正确吗?(如果这段话含糊不清,我很抱歉)我的意思是我是否遗漏了代码的某些阶段,例如: CFSocketSetAddress?

如果有人知道任何真正好的教程,这将是有帮助的。

任何帮助都是非常感谢的,因为我在这方面完全是一个初学者。

谢谢

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-24 11:58:48

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

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

票数 7
EN

Stack Overflow用户

发布于 2017-10-25 07:15:19

这是我两个晚上的第一段工作代码!希望对其他人有所帮助!我想我应该分享它,也许可以省去一些麻烦。

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

代码语言:javascript
复制
+ (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];
    });

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6804791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档