Разработка для iOS: получите приватный IP и порт от NSReadStream

Я занимаюсь разработкой приложения для 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;

1 ответ

Решение

Хорошо, теперь это работает для меня. Может быть, я могу помочь кому-то из 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;
}
Другие вопросы по тегам