我目前正在研究UDP套接字应用程序,我需要内置支持,以便IPV4和IPV6连接可以将数据包发送到服务器.
我希望有人可以帮助我,并指出我正确的方向; 我发现的大部分文档都不完整.如果你能指出Winsock和BSD套接字之间的任何差异,也会有所帮助.
提前致谢!
我在这里有一些代码在IPv4机器上运行良好,但在我们的构建服务器(IPv6)上它失败了.简而言之:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
Run Code Online (Sandbox Code Playgroud)
GetHostEntry的文档说,传入string.Empty将获得localhost的IPv4地址.这就是我要的.问题是它在我们的IPv6机器上返回字符串":: 1:",我认为这是IPv6地址.
从任何其他IPv4机器ping机器可以提供良好的IPv4地址......并且从自身执行"ping -4 machinename"会给出正确的IPv4地址....但是从它自身定期ping它会产生":: 1:".
如何从本身获取此机器的IPv4?
正如您在下面的屏幕截图中看到的那样,eclipse和Android SDK Manager(以及其他Java程序)正在尝试通过IPv6 TCP/IP堆栈连接到IPv4 Internet IP,而Proxifier(代理管理器程序,永不服务)无法支持.


我如何在Java中禁用IPv6?
获取java.net.SocketException试图启动一个多播提供程序时:
2013-09-11 11:45:44,204 [main] ERROR net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider: Error starting heartbeat. Error was: Can't assign requested address
java.net.SocketException: Can't assign requested address
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178)
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:319)
at net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatReceiver.init(MulticastKeepaliveHeartbeatReceiver.java:88)
at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.java:95)
Run Code Online (Sandbox Code Playgroud) 我正在更改一些表以将IP地址存储为数字而不是字符串.这对于IPv4来说很简单,其中32位地址可以适合整数列.但是,IPv6地址是128位.
的MySQL文档仅示出了数字类型多达64个比特("BIGINT").
我应该坚持使用char/varchar进行IPv6吗?(理想情况下,我想对IPv4和IPv6使用相同的列,所以我不想这样做).
有没有比使用两个bigint列更好的东西?每当使用地址时,我宁愿不必将值分解为上限和下限/ 64.
我正在使用MariaDB 5.1 - 如果在更高版本的MySQL中有更好的解决方案,那么很高兴知道,虽然没有立即帮助.
[编辑]请注意,我建议采用最佳方式执行此操作 - 很明显,有多种方法可以做到这一点(包括现有的字符串表示),但是(在性能方面)最好?(即如果某人已经完成了分析,这将使我无法做到这一点,或者如果我遗漏了一些明显的东西,那么知道也很好).
Linux中是否有任何命令可以获取主机名的IPv6地址?
我试过了NSLookup,但似乎没有选择获取指定主机名的IPv6地址,或者我错过了它.
我有一个处理IPv6的C程序,我想通过使用不同的方法来获取主机的IPv6地址来检查我是否得到了正确的结果.
我怎么做?
现在,IPv6将不会被使用,但我需要设计应用程序以使其为IPv6做好准备.有必要在MySQL数据库中存储IP地址和CIDR块(也是BGP NLRI,但这是另一个故事).我总是使用INT for IPv4 +一个TINYINT用于masklen,但IPv6是128位.
最适合的方法是什么?2xBIGINT?CHAR(16)用于二进制存储?CHAR(39)用于文本存储?8xSMALLINT在专门的桌子?
你会推荐什么?
我需要禁用IPv6.为此,java文档表明设置jvm属性java.net.preferIPv4Stack=true.
但我不明白如何从代码本身做到这一点.
许多论坛演示了从命令提示符执行此操作,但我需要在运行时执行此操作.
我需要在批处理脚本中验证字符串是否为有效的 IPv4 或 IPv6 地址,但显然批处理没有解析 IP 地址的简单方法。
如何在不使用外部工具的情况下在批处理中执行此操作?“外部工具”是指正常 Windows 安装中尚不存在的东西。
“有效的 IPv4 或 IPv6 地址”是指采用 IP 地址格式的字符串,类似字符串的误报999.999.999.999是可以的(即使一些基本过滤是受欢迎的)。根据经验,解决方案至少应该能够区分错误消息和地址。
我知道一个类似的问题已经存在,但是这个问题没有考虑 IPv6,而且它对“有效 IPv4 地址”的定义更加严格(类似999.999.999.999是不可接受的)。
在仔细搜索之后,我注意到PHP中用于处理IPv6的功能略有不足.为了我个人的满意,我创建了一些功能来帮助过渡.
该IPv6ToLong()函数是此处提出的临时解决方案:如何在关系数据库中存储与IPv6兼容的地址.它会将IP分成两个整数并将它们返回一个数组.
/**
* Convert an IPv4 address to IPv6
*
* @param string IP Address in dot notation (192.168.1.100)
* @return string IPv6 formatted address or false if invalid input
*/
function IPv4To6($Ip) {
static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address
$IPv6 = (strpos($Ip, '::') === 0);
$IPv4 = (strpos($Ip, '.') > 0);
if (!$IPv4 && !$IPv6) return false;
if ($IPv6 && $IPv4) $Ip = substr($Ip, strrpos($Ip, …Run Code Online (Sandbox Code Playgroud)