Получение имени хоста, подключающегося к сокету

Я использую класс Apple TCPServer для открытия сокета при прослушивании из входящего соединения. Вот обратный вызов, который вызывается, когда кто-то подключается к прослушивающему сокету:

static void TCPServerAcceptCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) { TCPServer *server = (TCPServer *)info; if (kCFSocketAcceptCallBack == type) { // for an AcceptCallBack, the data parameter is a pointer to a CFSocketNativeHandle CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)data; uint8_t name[SOCK_MAXADDRLEN]; socklen_t namelen = sizeof(name); NSData *peer = nil; if (0 == getpeername(nativeSocketHandle, (struct sockaddr *)name, &namelen)) { peer = [NSData dataWithBytes:name length:namelen]; } CFReadStreamRef readStream = NULL; CFWriteStreamRef writeStream = NULL; CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream); if (readStream && writeStream) { CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); [server handleNewConnectionFromAddress:peer inputStream:(NSInputStream *)readStream outputStream:(NSOutputStream *)writeStream]; } else { // on any failure, need to destroy the CFSocketNativeHandle // since we are not going to use it any more close(nativeSocketHandle); } if (readStream) CFRelease(readStream); if (writeStream) CFRelease(writeStream); } } 

Есть ли способ получить имя хоста подключаемого устройства? С уважением, Коса

[EDIT] Я попытался что-то вроде этого извлечь ip:

 struct sockaddr_in *s = (struct sockaddr_in*)name; char *ipstr = malloc(INET_ADDRSTRLEN); ipstr = inet_ntoa(s->sin_addr); NSLog(@"ip = %s", ipstr); 

Но это дает мне 0.0.0.0.

[EDIT] Все еще работает над этим и до сих пор нет успеха. Согласно документу яблока, параметр адреса:

Объект CFData, содержащий содержимое struct sockaddr, подходящего для семейства протоколов s (struct sockaddr_in или struct sockaddr_in6, например), идентифицирующий удаленный адрес, к которому подключен s. Это значение равно NULL, за исключением обратных вызовов kCFSocketAcceptCallBack и kCFSocketDataCallBack.

Однако я не могу извлечь какой-либо другой IP-адрес, чем 132.20.0.1 (это, очевидно, не тот IP-адрес, который я ожидаю). Я действительно смущен, и было бы здорово, если бы кто-то мог мне помочь!

    После попытки следовать вашему пути, чтобы получить адрес, я придумал небольшой вариант вашего кода, который работает на меня. Этот код работает, если вы имеете дело с адресами IPv6, но его легко изменить для работы с IPv4. Мне придется изменить код для работы с обоими в любом случае.

     - (void)getPublicClientAddress { // Get public IP from stream // Get hands on appropriate data structures via the socket number CFSocketNativeHandle nativeSocketHandle = _socketnumber; uint8_t name[SOCK_MAXADDRLEN]; socklen_t namelen = sizeof(name); NSData *peer = nil; if (0 == getpeername(nativeSocketHandle, (struct sockaddr *)name, &namelen)) { peer = [NSData dataWithBytes:name length:namelen]; } // TODO distiguish between ipv4 and ipv6 struct sockaddr_in6 *s = (struct sockaddr_in6*)name; // convert ip to string char *ipstr = malloc(INET6_ADDRSTRLEN); struct in6_addr *ipv6addr = &s->sin6_addr; // used pointer here, but that really should make no difference inet_ntop(AF_INET6, ipv6addr, ipstr, sizeof(ipstr)); // used a different function here // convert port to int int portnumber = s->sin6_port; // Save in properties _publicIP = [NSString stringWithFormat:@"%s", ipstr]; _publicPort = [NSString stringWithFormat:@"%d", portnumber]; } 

    Так что этот код работает для меня, и я надеюсь, что он может помочь кому-то, кто наткнулся на этот пост, ища ответ.

    Давайте будем гением компьютера.