2010-01-31 3 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

ли вы когда-нибудь найти что-то работал? –

ответ

1

во-первых, проверьте, чтобы убедиться, что peer содержит экземпляр NSData, который по длине равен нулю.

Если это так, то наиболее вероятной проблемой является то, что данные не соответствуют указанной кодировке, что приводит к тому, что NSString отказывается от кодировки и возвращает нулевую строку. Если это проблема с кодировкой, существует API для NSString для выполнения кодировок с потерями. Даже если потеря в вашем окончательном решении неприемлема, этот маршрут может быть весьма полезным для выяснения того, что происходит не так.

Что касается NULL, вы действительно имеете в виду nil. Было бы полезно вставить точный вывод строки журнала.

+0

my peer length is 16 Я обновил свой вопрос, чтобы прояснить ситуацию немного больше .... – Unis

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

+0

Вы не можете распечатать его, потому что вы пытаетесь создать NSString * из данных, отличных от c-string. Если вы хотите распечатать его, то используемый вами звонок не дает вам «правильную информацию» для вашей цели. – smorgan

2

sockaddr является структурой, а не просто ЬурейеЕ для символьного массива , Вам необходимо передать getpeername адрес фактической структуре sockaddr, а затем построить строку из поля sa_data этой структуры - и предполагается, что sa_data - это фактически строка для вашего типа адреса, которая в документации не предполагает, что вы можете фактически рассчитывать. Как говорится в другом ответе, это не тот вызов, который вам нужен, если ваша цель - получить строковое представление для печати.

(Кроме того, вам не нужен NSData вообще идти из массива символов в NSString, вы можете просто использовать -[NSString initWithBytes:length:encoding:])

Смежные вопросы