【问题标题】:iOS Development: Get private IP and port from NSReadStreamiOS 开发:从 NSReadStream 获取私有 IP 和端口
【发布时间】:2014-01-15 16:15:23
【问题描述】:

我正在为 iOS 开发一个应用程序。在我的应用程序中有一个到服务器的有效 TCP 连接,通过 NSStreams 实现。现在我需要连接使用的端口,这会产生一些问题。

我可以通过迭代设备的接口来获取 IP,但是对于端口号,我必须从套接字获取信息。在下面的代码中,我尝试从我的工作中获取套接字并打开 NSInputStream _readstream。问题是,CFSocketCopyAddress 为零,我不明白为什么。其他人可以吗?

非常感谢任何帮助!

// Initializing some variables we need
CFSocketContext context;
memset(&context, 0, sizeof(context));
context.info = (__bridge void*)self;
NSString *property = @"kCFStreamPropertySocketNativeHandle";

// Get hands on the used socket via the socket native handle
CFSocketNativeHandle *socketNativeHandle = (CFSocketNativeHandle*)CFReadStreamCopyProperty((__bridge CFReadStreamRef)(_readStream), (__bridge CFStringRef)(property));
CFSocketRef cfSocket = CFSocketCreateWithNative(NULL, *socketNativeHandle, kCFSocketNoCallBack, nil, &context);

// Ask the socket for the address information
CFDataRef               dataRef = CFSocketCopyAddress(cfSocket);                        // dataRef is always nil :(
struct sockaddr_in      *sockaddr = (struct sockaddr_in*)CFDataGetBytePtr(dataRef);

int portnumber = sockaddr->sin_port;

【问题讨论】:

    标签: ios sockets nsstream cfsocket


    【解决方案1】:

    好的,这对我有用。也许我可以帮助来自谷歌或其他地方的人......

    - (NSNumber*) getPortnumber{
        int             port        = -1;
    
        CFSocketContext context;
        memset(&context, 0, sizeof(context));
        context.info = (__bridge void*)self;
    
        // Get Socket native handle from existing stream
        CFDataRef socketData = CFWriteStreamCopyProperty((__bridge CFWriteStreamRef)(_writeStream), kCFStreamPropertySocketNativeHandle);
    
        // Get the native handle
        CFSocketNativeHandle handle;
        CFDataGetBytes(socketData, CFRangeMake(0, sizeof(CFSocketNativeHandle)), &handle);
    
        // Get the socket
        CFSocketRef cfSocket = CFSocketCreateWithNative(NULL, handle, kCFSocketNoCallBack, nil, &context);
    
        // CFSocketCopyAddress will return the address of the socket
        CFDataRef               dataRef = CFSocketCopyAddress(cfSocket);
        struct sockaddr_in      *sockaddr = (struct sockaddr_in*)CFDataGetBytePtr(dataRef);
    
        // Get the port from the address information
        port = sockaddr->sin_port;
    
        // Output Objective-C friendly =)
        NSNumber *portnr = [NSNumber numberWithInt:port];
        return portnr;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 2017-07-28
      相关资源
      最近更新 更多