ios - 如何从 iOS 中的 CFStream 获取远程地址?

标签 ios objective-c

我正在我的 iOS 应用程序中使用 CFStreams 连接到主机名,例如:

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

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

但我想知道如何从流中获取主机的远程IP地址?

最佳答案

您可以获得文件描述符(Apple 称之为“ native 句柄”),并使用典型的 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_storage addr;
socklen_t addr_len = sizeof(addr);
getpeername(socket, (struct sockaddr *)&addr, &addr_len);
NSString * remoteAddr;
if (addr.ss_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.ss_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);

关于ios - 如何从 iOS 中的 CFStream 获取远程地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55436951/

相关文章:

ios - 从 UIPastboard 粘贴字符串数据

ios - 使用 Swift PFIdResultBlock 错误解析云

ios - 如何以编程方式检查 iPhone 中可用的 3D Touch?

objective-c - 对 NSPopUpButton 进行排序

iphone - CFAttributedStringSetAttribute 和 NSNumber 中的 EXC_BAD_ACCESS?

objective-c - iOS开发中如何保存全局变量?

iphone - 在 Objective C 中创建链表

ios - 苹果开发者证书

iphone - iOS 位置更新甚至应用程序未运行(如查找我的 iPhone)

ios - 在 Swift 上完成触摸拖动后如何刷新?