获取到达数据包的IP地址

时间:2009-05-19 13:36:42

标签: cocoa networking

所以我正在使用

创建一个输入套接字

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

在receiveData函数中(正确调用)我正在尝试使用CFDataRef address参数找出此“包”的发件人地址。

发件人PC的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网络方面真的不大,所以非常感谢任何帮助/解释。

提前致谢!

3 个答案:

答案 0 :(得分:8)

这是我为我的一个项目实现的NSData的Category类。使用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 :(得分:1)

可能是网络流量在到达接收端的途中是NAT /伪装的。您为发送方PC提供的IP地址位于RFC 1918私有/未路由网络之一,而您看到的IP地址位于路由网络块上。

答案 2 :(得分:0)

好吧,除了编程错误并假设Mac平台,检查两台机器上ifconfig的输出,检查两台机器的route get <IP>路由;一直到tcpdump

顺便说一下,如果你不知道如何使用man工具,那么让BSD层在Mac上真的得到回报 - 就像man tcpdump一样。