首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从CFStream ( iOS )中获取远程地址?

如何从CFStream ( iOS )中获取远程地址?
EN

Stack Overflow用户
提问于 2019-03-31 00:57:16
回答 1查看 175关注 0票数 1

我在我的CFStreams应用程序中使用iOS连接主机名,如下所示:

代码语言:javascript
复制
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-31 00:57:16

您可以获得文件描述符( Apple称之为“本机句柄”),并使用典型的POSIX网络命令获取地址:

从流中获取文件描述符:

代码语言:javascript
复制
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;

获取该文件描述符的远程地址:

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55436951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档