Signatur
Beschreibung
Die Eigenschaft address eines RTCIceCandidate enthält die Netzwerkadresse, unter der der Kandidat erreichbar ist. Je nach Kandidatentyp (candidate.type) ist das eine lokale Host-Adresse (host), die öffentliche Adresse, die ein STUN-Server gemeldet hat (srflx), eine Peer-Reflexive-Adresse (prflx) oder die Adresse eines TURN-Relays (relay).
Der Wert wird aus der SDP-Zeile candidate: ausgelesen und ist nur lesbar. Wenn der Browser die Adresse nicht auswerten kann, ist der Wert null. Aus Datenschutzgründen ersetzen moderne Browser lokale Host-Adressen meist durch einen zufälligen mDNS-Hostnamen wie 1f4712db-ea17-4bcf-a596-105139dfd8bf.local. So sollen Webseiten keine internen IP-Adressen auslesen können.
Gebraucht wird die Eigenschaft vor allem zur Fehlersuche bei Verbindungen: Man sieht damit, ob STUN oder TURN überhaupt Kandidaten liefert, ob IPv6 verfügbar ist oder warum eine Verbindung nur über ein Relay zustande kommt. Für den eigentlichen Signalisierungsaustausch reicht es, das komplette Kandidatenobjekt (bzw. candidate.toJSON()) zu übertragen. Die Adresse muss man dafür nicht eigens herausziehen.
Rückgabewert
203.0.113.7), IPv6-Adresse, mDNS-Hostname (….local) oder null, wenn der Wert nicht verfügbar ist.Beispiele
Adressen gesammelter Kandidaten protokollieren
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
pc.addEventListener('icecandidate', ({ candidate }) => {
if (!candidate) {
console.log('ICE-Sammlung abgeschlossen');
return;
}
console.log(`${candidate.type} ${candidate.protocol} ${candidate.address}:${candidate.port}`);
});
// Ein DataChannel löst die Kandidatensammlung aus
pc.createDataChannel('probe');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Kandidat aus einer SDP-Zeile erzeugen und auslesen
const candidate = new RTCIceCandidate({
candidate: 'candidate:842163049 1 udp 1677729535 198.51.100.23 61234 typ srflx raddr 0.0.0.0 rport 0 generation 0',
sdpMid: '0',
sdpMLineIndex: 0
});
console.log(candidate.address);
console.log(candidate.type);
Prüfen, ob STUN eine öffentliche Adresse geliefert hat
const checkStun = (stunUrl, timeout = 5000) => new Promise(async (resolve) => {
const pc = new RTCPeerConnection({ iceServers: [{ urls: stunUrl }] });
const timer = setTimeout(() => { pc.close(); resolve(null); }, timeout);
pc.onicecandidate = ({ candidate }) => {
if (candidate?.type === 'srflx' && candidate.address) {
clearTimeout(timer);
pc.close();
resolve(candidate.address);
}
};
pc.createDataChannel('test');
await pc.setLocalDescription(await pc.createOffer());
});
const publicIp = await checkStun('stun:stun.l.google.com:19302');
console.log(publicIp ? `STUN funktioniert: ${publicIp}` : 'Kein srflx-Kandidat – STUN blockiert?');
// Wichtig · Fallstricke
- Datenschutz: Die Adresse kann die öffentliche IP und bei älteren Browsern auch interne IPs verraten (sogenannte „WebRTC-Leaks“, z. B. an einem VPN vorbei). Chrome, Safari und Firefox verbergen Host-Adressen deshalb standardmäßig hinter mDNS-Namen (
*.local). Man sollte sich also nicht darauf verlassen, hier eine echte IP zu bekommen. - Kein gültiger Wert: Ist
addressnull, konnte der Browser die Kandidatenzeile nicht auswerten, oder das Feld wird nicht unterstützt. Ältere Firefox-Versionen vor 68 kannten die Eigenschaft nicht. Dort muss man den Wert selbst auscandidate.candidateherauslesen. - Das Ende der Sammlung wird mit
candidate === nullgemeldet (in manchen Browsern auch mit einem leeren String alscandidate). Deshalb vor dem Zugriff aufaddressprüfen, ob ein Kandidat vorhanden ist. - Bei
relay-Kandidaten ist das die Adresse des TURN-Servers und nicht die des Gegenübers. Die ursprüngliche Adresse steht inrelatedAddress. - In der Spezifikation hieß die Eigenschaft früher
ip. Manche Implementierungen haben diesen Namen noch als Alias.