CFSocket — UDP

本文介绍如何使用C语言通过CFNetwork框架创建并管理一个UDP IP v4套接字,实现服务器端监听特定端口,并接收客户端发送的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CFSocketContext socketContext = {0, self, NULL, NULL, NULL};
    
    /* Create the server socket as a UDP IPv4 socket and set a callback */
    /* for calls to the socket's lower-level accept() function */
    cfSocket = CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketNoCallBack , NULL, &socketContext);
    
    // getsockopt will return existing socket option value via this variable
    int existingValue = 1;
     
    // Make sure that same listening socket address gets reused after every connection
    setsockopt( CFSocketGetNative(cfSocket),SOL_SOCKET, SO_REUSEADDR, (void *)&existingValue,sizeof(existingValue));
    
    /* Set the port and address we want to listen on */
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8081);
    addr.sin_addr.s_addr = inet_addr([serverIP UTF8String]);
    CFDataRef address = CFDataCreate(
                                     kCFAllocatorDefault,
                                     (UInt8*)&addr,
                                     sizeof(addr));
    
    char ethadd []= "0x0";
    CFDataRef data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd));
    arguArray = [[NSMutableArray alloc]initWithObjects:(id)address, data,nil];
    
    cfSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
    
    //set the socket to no block mode before connecting with server
    int flags = fcntl(CFSocketGetNative(cfSocket), F_GETFL,0);
    fcntl(CFSocketGetNative(cfSocket), F_SETFL,flags|O_NONBLOCK);
    NSLog(@"---flags----%d", flags);


send package

CFSocketSendData(cfSocket, (CFDataRef)[arguArray objectAtIndex:0], (CFDataRef)[arguArray objectAtIndex:1], 0);


Read data

recvfrom(CFSocketGetNative(cfSocket), (void *)&msg, MAX_UDP_DATAGRAM_SIZE, 0, (struct sockaddr *)&from_addr, &addr_len);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值