Obter o endereço IP de chegar pacote de dados

votos
0

Então, eu estou criando uma tomada de entrada usando

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

Dentro da função dadosRecebidos (que é chamada corretamente) Eu estou tentando usar o CFDataRef addressparâmetro para descobrir o endereço do remetente do pacote esta.

O endereço IP do computador do remetente está em 192.168.1.2.

estou a usar

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

No entanto, eu sempre obter a 192.6.105.48 fora do log. O que da? Eu não sou realmente grande em rede em Cocoa / C por isso qualquer ajuda / explicação é muito apreciado.

Desde já, obrigado!

Publicado 19/05/2009 em 14:36
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

Aqui está uma classe Categoria de NSData que eu implementada para um dos meus projetos. Usando a ponte toll-free entre CFDataRef e NSData você pode usar a seguinte classe.

@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
Respondeu 24/05/2009 em 19:53
fonte usuário

votos
1

Pode ser que a rede de tráfego é NAT / masqueraded no caminho para o fim de recepção. O endereço IP que você deu para o PC remetente está em um dos 1918 redes privadas / unrouted RFC, enquanto que o endereço IP que você está vendo está em uma rede de blocos roteado.

Respondeu 19/05/2009 em 15:01
fonte usuário

votos
0

Bem, salvo erros de programação e assumindo plataforma Mac, verifique a saída de ifconfigem ambas as máquinas, verificar o encaminhamento com o route get <IP>de ambas as máquinas; e todo o caminho até tcpdump.

By the way, tendo camada BSD realmente compensa no Mac - se você não sabe como usar uma ferramenta apenas manele, como man tcpdump.

Respondeu 19/05/2009 em 14:51
fonte usuário

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