Получить IP-адрес прибытия пакета данных

голоса
0

Поэтому я создаю входной разъем, используя

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 из журнала. Что дает? Я действительно не большой по сети в Cocoa / C, так что любая помощь / объяснение очень высоко ценится.

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

Задан 19/05/2009 в 12:36
источник пользователем
На других языках...                            


3 ответов

голоса
0

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

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

Ответил 19/05/2009 в 12:51
источник пользователем

голоса
1

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

Ответил 19/05/2009 в 13:01
источник пользователем

голоса
8

Вот Категория класс 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
Ответил 24/05/2009 в 17:53
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more