Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS开发:从NSReadStream获取专用IP和端口_Ios_Sockets_Nsstream_Cfsocket - Fatal编程技术网

iOS开发:从NSReadStream获取专用IP和端口

iOS开发:从NSReadStream获取专用IP和端口,ios,sockets,nsstream,cfsocket,Ios,Sockets,Nsstream,Cfsocket,我正在为iOS开发一个应用程序。在我的应用程序中,有一个到服务器的工作TCP连接,通过NSStreams实现。现在我需要连接使用的端口,它会产生一些问题 我可以通过迭代设备的接口来获取IP,但是对于端口号,我必须从套接字获取信息。在下面的代码中,我尝试从工作中获取套接字并打开NSInputStream\u readstream。问题是,CFSocketCopyAddress为零,我看不出原因。你能找其他人吗 非常感谢您的帮助 // Initializing some variables we n

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

我可以通过迭代设备的接口来获取IP,但是对于端口号,我必须从套接字获取信息。在下面的代码中,我尝试从工作中获取套接字并打开NSInputStream
\u 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;

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

- (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;
}