2010-01-31 82 views
1

我收到一个到服务器的连接成功,我在我的回调函数:转换的NSData到NSString的

我试图让主机的名称,并打印到我的控制台:

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); 
     } 

当我在调试模式下运行应用程序时,我可以看到分配给名称的IP地址值,所以它成功获取名称,每个值都是uint8_t .. 对等长度显示给我16; 我的问题将其转换为NSData的则的NSString ...

输出: 2010-01-31 13:57:58.671连接对等的IP地址:(空)

我串正被作为NULL输出,

任何建议表示赞赏,感谢....

+0

你有没有发现一些工作? – 2010-05-11 21:11:56

回答

1

首先,检查,以确保peer包含NSData的实例,它的长度为非零。

如果是这样,那么最可能的问题是数据不能正确指定编码,导致NSString无法编码并返回一个零字符串。如果这是一个编码问题,那么在NSString上有API用于做有损编码。即使您的最终解决方案中有损失是不可接受的,走这条路线对于弄清楚发生了什么问题是非常有帮助的。

这个假设通过NULL你真的意思是nil。粘贴日志行的确切输出会很有帮助。

+0

我的同龄人的长度是16 我更新了我的问题,以澄清事情多一点.... – Unis 2010-01-31 18:59:51

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. 
+0

感谢澄清,但我得到正确的信息做到这一点,但我不能将对等体(NSData)转换为NSString然后输出值.... – Unis 2010-01-31 20:55:54

+0

您无法打印它,因为您尝试从非c字符串数据中创建NSString *。如果您想打印它,那么您使用的电话不会为您的目的提供“正确的信息”。 – smorgan 2010-01-31 21:33:30

2

sockaddr是一个结构,而不仅仅是一个字符数组的typedef 。您需要将getpeername地址传递给实际的sockaddr结构,然后从该结构的sa_data字段构建字符串 - 假设sa_data实际上是您的地址类型的字符串,文档不建议您可以实际上依靠。正如另一个答案所说,如果你的目标是获得一个字符串表示来打印出来,这不是你想要的。

(另外,你并不需要一个NSData都从字符数组一个NSString去,你可以使用-[NSString initWithBytes:length:encoding:]