Получить IP-адрес прибывающего пакета данных - PullRequest
0 голосов
/ 19 мая 2009

Итак, я создаю входной сокет, используя

CFSocketCreateWithSocketSignature (NULL, &signature, kCFSocketDataCallBack, receiveData, &socket_context);

В функции receiveData (которая вызывается правильно) я пытаюсь использовать параметр CFDataRef address, чтобы узнать адрес отправителя этого «пакета».

IP-адрес компьютера отправителя: 192.168.1.2.

Я использую

char buffer[INET_ADDRSTRLEN]; NSLog([NSString stringWithFormat:@"incoming connection from: %s", inet_ntop(AF_INET, address, buffer, INET_ADDRSTRLEN)]);

Однако я всегда получаю 192.6.105.48 из журнала. Что дает? Я действительно не очень разбираюсь в сетях в Какао / Си, поэтому любая помощь / объяснение очень ценится.

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 24 мая 2009

Вот класс Category NSData, который я реализовал для одного из моих проектов. Используя бесплатный мост между CFDataRef и NSData, вы можете использовать следующий класс.

@implementation NSData (Additions)

- (int)port
{
    int port;
    struct sockaddr *addr;

    addr = (struct sockaddr *)[self bytes];
    if(addr->sa_family == AF_INET)
        // IPv4 family
        port = ntohs(((struct sockaddr_in *)addr)->sin_port);
    else if(addr->sa_family == AF_INET6)
        // IPv6 family
        port = ntohs(((struct sockaddr_in6 *)addr)->sin6_port);
    else
        // The family is neither IPv4 nor IPv6. Can't handle.
        port = 0;

    return port;
}


- (NSString *)host
{
    struct sockaddr *addr = (struct sockaddr *)[self bytes];
    if(addr->sa_family == AF_INET) {
        char *address = 
          inet_ntoa(((struct sockaddr_in *)addr)->sin_addr);
        if (address)
            return [NSString stringWithCString: address];
    }
    else if(addr->sa_family == AF_INET6) {
        struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
        char straddr[INET6_ADDRSTRLEN];
        inet_ntop(AF_INET6, &(addr6->sin6_addr), straddr, 
            sizeof(straddr));
        return [NSString stringWithCString: straddr];
    }
    return nil;
}

@end
1 голос
/ 19 мая 2009

Возможно, сетевой трафик NAT / маскируется на пути к принимающей стороне. IP-адрес, который вы указали для компьютера отправителя, находится в одной из частных / не маршрутизированных сетей RFC 1918, а IP-адрес, который вы видите, находится в маршрутизируемом сетевом блоке.

0 голосов
/ 19 мая 2009

Хорошо, за исключением ошибок программирования и допущения о платформе Mac, проверьте вывод ifconfig на обеих машинах, проверьте маршрутизацию с помощью route get <IP> с обеих машин; и вплоть до tcpdump.

Кстати, слой BSD действительно окупается на Mac - если вы не знаете, как использовать инструмент, просто man его, например, man tcpdump.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...