2014-01-15 6 views
1

Я разрабатываю приложение для iOS. В моем приложении есть рабочее TCP-соединение с сервером, реализованное через NSStreams. Теперь мне нужен порт, который использует соединение, что создает некоторые проблемы.Разработка iOS: получить частный IP и порт от NSReadStream

Я могу получить 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; 

ответ

1

OKay, теперь это работает для меня. Возможно, я могу помочь кому-то, кто пришел из Google или из другого места.

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