我收到了与服务器的成功连接,我在回调函数中:
我正在尝试获取主机的名称并将其打印到我的控制台:
if(theType == kCFSocketConnectCallBack){
NSLog(@"Connection is accepted");
CFSocketNativeHandle nativeSocket = CFSocketGetNative(theSocket);
uint8_t name[SOCK_MAXADDRLEN];
socklen_t namelen = sizeof(name);
NSData *peer = nil;
if (getpeername(nativeSocket, (struct sockaddr *)name, &namelen) == 0) {
peer = [NSData dataWithBytes:name length:namelen];
NSString *string = [[NSString alloc] initWithData:peer encoding:NSUTF8StringEncoding];
NSLog(@"IP adress of connected peer: %@", string);
}
当我在调试模式下运行应用程序时,我可以看到分配给name的IP地址值,因此它成功获取名称,每个值都是uint8_t .. 对等长度显示我16; 我的问题是将它转换为NSData然后转换为NSString ...
输出: 2010-01-31 13:57:58.671连接对等体的IP地址:( null)
我的字符串输出为NULL,
感谢任何建议,谢谢......
答案 0 :(得分:2)
getpeername()不返回远程端的主机名;它返回地址:
$ man getpeername ... DESCRIPTION The getpeername() function returns the address of the peer connected to the specified socket.
你想要getnameinfo():
$ man getnameinfo ... DESCRIPTION The getnameinfo() function is used to convert a sockaddr structure to a pair of host name and service strings. It is a replacement for and pro- vides more flexibility than the gethostbyaddr(3) and getservbyport(3) functions and is the converse of the getaddrinfo(3) function.
或gethostbyaddr():
$ man gethostbyaddr ... DESCRIPTION The getaddrinfo(3) and getnameinfo(3) functions are preferred over the gethostbyname(), gethostbyname2(), and gethostbyaddr() functions. The gethostbyname(), gethostbyname2() and gethostbyaddr() functions each return a pointer to an object with the following structure describing an internet host referenced by name or by address, respectively.
答案 1 :(得分:2)
sockaddr
是一个结构,而不仅仅是字符数组的typedef。您需要将getpeername
地址传递给实际的sockaddr
结构,然后从该结构的sa_data
字段构建字符串 - 并且假设sa_data
实际上是-[NSString initWithBytes:length:encoding:]
您的地址类型的字符串,文档并未建议您可以依赖该字符串。正如另一个答案所说,如果你的目标是获得打印出的字符串表示,那么这不是你想要的电话。
(另外,根本不需要NSData从字符数组转到NSString;你可以只使用{{1}})
答案 2 :(得分:1)
首先,检查以确保peer
包含长度非零的NSData实例。
如果确实如此,那么最可能的问题是数据不正确的指定编码导致NSString失败编码并返回一个nil字符串。如果是编码问题,NSString上有API用于执行有损编码。即使你的最终解决方案中的损失是不可接受的,走这条路线对于弄清楚出了什么问题也是非常有帮助的。
假设NULL
你的意思是nil
。粘贴日志行的确切输出会很有帮助。