【问题标题】:Getting sockaddr_in from CFDataRef从 CFDataRef 获取 sockaddr_in
【发布时间】:2012-11-15 11:46:06
【问题描述】:

我有一个包含客户端地址(struct sockaddr_in)的 CFDataRef(我什至不确定,为什么我不再使用 CFData 和 Socket..),我需要获取 IP 和端口。不幸的是,没有直接的方法可以得到它们。

因此我尝试了以下方法:

CFDataRef clientAddress = ...; //defined somewhere else, contains a sockaddr_in
struct sockaddr_in clientAddress2;
clientAddress2 = *(struct sockaddr_in*)CFDataGetBytePtr(clientAddress);

(不要把名字当回事,它们只是为了这个例子的目的)。 不幸的是,CFDataGetBytePtr 的执行似乎崩溃了,因为在运行我的应用程序时出现“EXC_BAD_ACCESS (code=2,address=0x0)”错误。

从包含 sockaddr_in 的 CFDataRef 获取 IP 和端口的最佳方法是什么?

谢谢!

【问题讨论】:

  • 我不确定为什么你会下降到那个水平:) 但请看我的回答
  • CFDataGetBytePtr 不复制字节,因此它们与数据一起被释放。也许这是你的问题?结构指向已释放的内存
  • 好吧,CFSocket 是我能找到的最好的实现 UDP 连接的方法。但是,似乎在使用它们时,您需要非常快速地回到 C 级别,甚至必须在两个方向上进行转换 :-( 不确定我是否明白您的意思。为什么要释放数据?文档确实什么都不说。仍然无法找出正确的解决方案..
  • CFDataRef 在 CFDataRef 被释放时释放它的字节,然后 socket_addr* 变成一个指向垃圾的指针

标签: objective-c network-programming


【解决方案1】:

您可以将 CFDataRef 转换为 NSData,然后将 BYTES 分配给结构 sockaddr

如果地址可能是 IP6 或 IP4,请检查 INET FAMILY,然后将 BYTES 分配给正确的结构(sockaddr_in 用于 IP4 或 sockaddr_in6强> IP6)

例如,假设 addressCFDataRef address

类型的值
    NSString *addressString;
    int port=0;
    struct sockaddr *addressGeneric;
    struct sockaddr_in addressClient;

    NSData *myData = (__bridge NSData *)address;
    addressGeneric = (struct sockaddr *) [myData bytes];

    switch( addressGeneric->sa_family ) {
        case AF_INET: {
          struct sockaddr_in *ip4;
          char dest[INET_ADDRSTRLEN];
          ip4 = (struct sockaddr_in *) [myData bytes];
          port = ntohs(ip4->sin_port);
          addressString = [NSString stringWithFormat: @"IP4: %s Port: %d", inet_ntop(AF_INET, &ip4->sin_addr, dest, sizeof dest),port];
         }
         break;

        case AF_INET6: {
            struct sockaddr_in6 *ip6;
            char dest[INET6_ADDRSTRLEN];
            ip6 = (struct sockaddr_in6 *) [myData bytes];
            port = ntohs(ip6->sin6_port);
            addressString = [NSString stringWithFormat: @"IP6: %s Port: %d",  inet_ntop(AF_INET6, &ip6->sin6_addr, dest, sizeof dest),port];
         }
         break;
       default:
         addressString=@"Error on get family type.";
         break;
     }

     NSLog(@"Client Address: %@",addressString);

这是输出

2013-08-25 12:22:35.308 FGWakeService[9283:303] 客户端地址:IP4:192.168.69.38 端口:58614

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多