我在asp.net应用程序中有一些代码需要获取客户端计算机的ipv4地址(用户都在我们自己的网络上).最近我们将应用程序运行的服务器升级到Windows 2008服务器.现在,当客户端在较旧的操作系统上时,Request.UserHostAddress代码返回ipv4,而当它们在较新的操作系统(Vista和更高版本)上时,返回ipv6.因此,依赖于此的功能适用于某些客户而非其他客户.
我添加了应该从ipv6转换为ipv4的代码,以尝试解决此问题.这是来自这个在线教程:http://www.4guysfromrolla.com/articles/071807-1.aspx.我正在使用dsn.GetHostAddress然后循环返回的IP寻找一个"InterNetwork"
foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
{
if (IPA.AddressFamily.ToString() == "InterNetwork")
{
IP4Address = IPA.ToString();
break;
}
}
if (IP4Address != String.Empty)
{
return IP4Address;
}
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IPA.AddressFamily.ToString() == "InterNetwork")
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
Run Code Online (Sandbox Code Playgroud)
问题是这不适合我.从ipv4连接的客户端继续返回客户端计算机的正确ipv4 IP,但是从Vista和Windows 7连接的客户端返回SERVER计算机的ipv4 IP而不是客户端计算机.
我目前正在尝试了解IPv6地址的工作原理.存在分别用于小型和组织网络的链接本地和站点本地地址.但如果其中一个客户也有互联网接入,它需要两个IP,对吗?一个链接/站点本地和一个全球地址.如何由接口和路由器管理?一个接口需要两个IP,因为IPv6中没有NAT.
我试图运行这个非常基本的套接字示例:
import socket
host = 'ipv6hostnamegoeshere'
port=9091
ourSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
ourSocket.connect((host, port))
Run Code Online (Sandbox Code Playgroud)
然而,我得到错误:
ourSocket.connect((host, port))
File "<string>", line 1, in connect
socket.error: [Errno 22] Invalid argument
Run Code Online (Sandbox Code Playgroud)
布尔值has_ipv6返回true.有帮助吗?
根据几个国家/地区的法律要求,我们会在日志文件中匿名化用户的IP地址.使用IPv4我们经常只对最后两个字节进行匿名化,例如.而不是255.255.255.255我们记录255.255.*.*
您建议使用什么算法来匿名化IPv6地址?
我一直在成功使用IPv4到国家转换器.例如:获取机器的IP并与表进行比较以获得国家.
我目前正在更新这个,并且我想问一下IPv6是否有将IPv6转换为国家的解决方案?
注意:偏爱PHP和MySQL
谢谢
我以前使用下面的代码将IPv4地址绑定到Python套接字作为源IP地址.
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind((sourceIP, 0))
return sock
socket.socket = bound_socket
Run Code Online (Sandbox Code Playgroud)
上面的代码是否适用于IPv6地址?如果没有,我如何绑定IPv6地址?
提前致谢!
互联网上有几个众所周知的IPv4地址,人们广泛使用这些地址来测试他们的互联网连接 - 4.2.2.2,8.8.8.8,8.8.4.4等.但是IPv6怎么样呢?有人知道任何容易记住的公共可ping的IPv6地址吗?
当主节点发生故障时,其IP(IPv6)将浮动到备用节点.备用节点应该在该IP上提供服务.
鉴于这两个节点共存于同一LAN中,通常可以看出备用节点变得无法访问.接口为UP和RUNNING,并分配了IPv6地址,但所有IP操作都已停止.
一种可能性是当IP配置为待机时,重复地址检测(DAD)正在开始.RFC表示必须停止所有IP操作.
我的问题是关于Linux内核IPv6实现的细节.以前,从内核代码来看,我认为必须设置sysctl变量"disable_ipv6".但是内核没有禁用IPv6,它只是停止该接口上的所有IP操作.
任何人都可以解释Linux内核IPv6在DAD失败时"禁用这些IP操作"时的作用吗?如果不进行DOWN&UP接口,可以重置为正常吗?代码中的任何指针都将非常有用.
network-programming ipv6 linux-kernel openstack openstack-nova
我在iOS中有一项功能,如果IPv6中的用户设备网络,我需要禁用它.有没有办法我们可以通过编程方式将设备(iPhone/iPad)的IP地址作为字符串获取,然后检查它是IPv4还是IPv6网络(或者只是在不获取实际地址的情况下判断它是在IPv4还是IPv6网络上)?
我能找到的最近的是iPhone/iPad/OSX:如何以编程方式获取我的IP地址?(David H.),它再次要求我们事先指定网络,因此无法解决我的目的......通过他的解决方案,我总是得到一个IPv4或者总是得到一个IPv6.
对于IPv6测试,我使用Apple推荐的NAT64工具(https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html).
作为一种解决方法,我现在使用DNS来检查(https://hirooka.pro/?p=6169),我觉得这不是一个正确的方法,因为它应该是基于IP地址.另外,非常奇怪的是,iPad总是显示一个IPv4地址(即使连接到IPv6网络),但只是在DNS风格上有所不同......有人知道为什么会这样吗?
提前致谢.
我可以使用下面的代码来获取IPv4 DNS地址.使用IPv6 DNS地址,res_ninit()无法分析IPv6地址.与此类似,iOS的-获取IPv6的唯一网络设备的DNS服务器地址,sin_family永远是AF_UNSPEC.
有没有其他解决方案来获取IPv6 DNS地址?感谢帮助.
+ (void)outPutDNSServers {
res_state res = malloc(sizeof(struct __res_state));
int result = res_ninit(res);
if ( result == 0 ) {
for ( int i = 0; i < res->nscount; i++ ) {
NSString *s = [NSString stringWithUTF8String : inet_ntoa(res->nsaddr_list[i].sin_addr)];
NSLog(@"%@",s);
}
}
else {
NSLog(@"%@",@" res_init result != 0");
}
res_nclose(res);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经解决了下面的问题.
+ (void)outPutDNSServers {
res_state res = malloc(sizeof(struct __res_state));
int result = res_ninit(res);
if (result …Run Code Online (Sandbox Code Playgroud) ipv6 ×10
ip ×3
dns ×2
ios ×2
networking ×2
python ×2
sockets ×2
anonymity ×1
asp.net ×1
c# ×1
linux-kernel ×1
objective-c ×1
openstack ×1
ping ×1
xcode ×1