2010-01-31 172 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:]