所以我正在使用
创建一个输入套接字 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网络方面真的不大,所以非常感谢任何帮助/解释。
提前致谢!
答案 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
一样。