Ich bin eine Java-Anwendung zu schreiben, die eine Socket
öffnet, wie folgt:In welchen Fällen wird Socket.getLocalAddress() ein IPv6 im Gegensatz zu einem IPv4 sein?
socketConnection = new Socket();
socketConnection.connect(new InetSocketAddress(server, port));
und führt gelegentlich Operationen wie Lesen und Schreiben. Eine Funktion, die wichtig ist, um Metadaten zusammen mit Paketen zu senden, sind die lokalen und entfernten Adressen der Verbindung. Zum Beispiel, erhalte ich die lokale Adresse Bytes als:
public byte[] getLocalIP() {
InetAddress localAddr = socketConnection.getLocalAddress();
byte[] addressBytes = localAddr.getAddress();
return addressBytes;
}
Mein Protokoll möchte die IPv4 des Senders zusammen im Header gesendet haben. Manchmal gibt diese Funktion jedoch 16 statt 4 Bytes zurück, was Probleme verursacht. Noch verwirrender, ändert sich das Verhalten manchmal innerhalb desselben Laufs des Programms, trotz des gleichen Socket-Objekts, das IPv4 für vorherige Aufrufe zurückgibt. Es ist schwierig zu replizieren, ich bin mir immer noch nicht sicher, unter welchen Umständen es passiert.
Unter welchen Umständen wird das obige ein IPv6 statt eines IPv4 zurückgeben? Ist das abhängig von dem Netzwerk, auf dem ich arbeite? Und was würde dazu führen, dass es sich mitten in einer Programmausführung verschiebt?
Es sollte ziemlich offensichtlich sein, welche Bedingung das verursacht - Sie erstellen einen IPv6-Socket, der an eine IPv6-Adresse gebunden ist (mit 'Inet6Address'), anstatt einen IPv4-Socket zu erstellen, der an eine IPv4-Adresse gebunden ist (mit' Inet4Address')).Wie erstellst und konfigurierst du 'socketConnection'? Ist diese Client-Seite oder Server-Seite? Bitte geben Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) an. Wenn Ihr Protokoll keine IPv6-basierten Metadaten unterstützt, erstellen Sie zunächst keinen IPv6-Socket. –
Ich habe ein Beispiel hinzugefügt, wie ich die Verbindung initialisiere. Ich habe auch klargestellt, dass das selbe "Socket" -Objekt während einer einzelnen Ausführung des Programms manchmal 4 Bytes gegenüber 16 Bytes zurückgibt, nachdem das Objekt initialisiert und verbunden wurde. –
Es ist * PHYSISCH UNMÖGLICH * für einen verbundenen 'Socket', sowohl IPv4- als auch IPv6-Adressen zurückzugeben oder verschiedene IPv4/IPv6-Adressen zu unterschiedlichen Zeiten zurückzugeben. Es kann immer nur an eine Adresse gebunden sein, und diese Adresse ist für die Lebensdauer der Verbindung persistent. Wenn Sie unterschiedliche Ergebnisse sehen, müssen Sie etwas falsch in Ihrem Code tun, aber Sie haben kein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zur Diagnose bereitgestellt Was könnte das sein? –