我写打开Socket
一个Java应用程序,如下所示:在什么情况下,Socket.getLocalAddress()是IPv6还是IPv4?
socketConnection = new Socket();
socketConnection.connect(new InetSocketAddress(server, port));
偶尔如读取和写入执行操作。一个对发送元数据和数据包很重要的函数是连接的本地和远程地址。例如,我得到了本地地址字节:
public byte[] getLocalIP() {
InetAddress localAddr = socketConnection.getLocalAddress();
byte[] addressBytes = localAddr.getAddress();
return addressBytes;
}
我的协议,希望有在头一起发送发送端的IPv4。但是,有时这个函数返回16个字节而不是4个,这会导致问题。更令人困惑的是,尽管相同的Socket对象返回IPv4以前的调用,但程序在同一运行过程中有时会发生变化,即。这很难复制,我还不确定它在什么情况下发生。
在什么情况下上述情况会返回IPv6而不是IPv4?这是依赖于我运行的网络吗?在程序执行过程中会发生什么样的变化?
应该很明显是什么原因导致这种情况 - 您正在创建绑定到IPv6地址的IPv6套接字(使用'Inet6Address'),而不是创建绑定到IPv4地址的IPv4套接字(使用'Inet4Address' )。你最初如何创建和配置'socketConnection'?这是客户端还是服务器端?请提供[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。如果您的协议不支持基于IPv6的元数据,则不要创建IPv6套接字来开始。 –
我添加了一个如何初始化连接的例子。我还澄清说,在对象初始化并连接之后,在程序的单次运行期间,相同的'Socket'对象有时会返回4个字节与16个字节。 –
对于连接的'Socket'来说,它是*物理上不可能的*返回IPv4和IPv6地址,或者在不同的时间返回不同的IPv4/IPv6地址。它一次只能绑定到一个地址,并且该地址在连接的整个生命周期中都是持久的。如果你看到不同的结果,你*有*在你的代码中做错了,但你没有提供[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve)来诊断那可能是什么。 –