Как я могу получить удаленный адрес от CFStream в iOS? - PullRequest
0 голосов
/ 31 марта 2019

Я подключаюсь к имени хоста с помощью CFStreams в моем приложении для iOS, например:

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);

outputStream = (__bridge NSOutputStream *)writeStream;
inputStream = (__bridge NSInputStream *)readStream;

Но я хочу знать, как я могу получить удаленный IP-адрес host из потока?

1 Ответ

0 голосов
/ 31 марта 2019

Вы можете получить дескриптор файла (который Apple называет «Native Handle»), и с его помощью использовать ваши типичные сетевые команды POSIX для получения адреса:

Получить дескриптор файла из потока:

CFDataRef handleData = (CFDataRef)CFReadStreamCopyProperty((__bridge CFReadStreamRef) inputStream, kCFStreamPropertySocketNativeHandle);
long length = CFDataGetLength(handleData);
uint8_t * buffer = malloc(length);
CFDataGetBytes(handleData, CFRangeMake(0, length), buffer);
int sock_fd = (int)*buffer;

Получить удаленный адрес для этого дескриптора файла:

struct sockaddr addr;
socklen_t addr_len = sizeof(addr);
getpeername(sock_fd, &addr, &addr_len);
NSString * remoteAddr;
if (addr.sa_family == AF_INET) {
    char addressString[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &((struct sockaddr_in *)&addr)->sin_addr, addressString, INET_ADDRSTRLEN);
    remoteAddr = [[NSString alloc] initWithUTF8String:addressString];
} else if (addr.sa_family == AF_INET6) {
    char addressString[INET6_ADDRSTRLEN];
    inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&addr)->sin6_addr, addressString, INET6_ADDRSTRLEN);
    remoteAddr = [[NSString alloc] initWithUTF8String:addressString];
}
free(buffer);

// Now you have remoteAddr which will be a
// string representation of a IPv4 or IPv6 address!
NSLog(@"Remote Address: %@", remoteAddr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...