Signatur
Beschreibung
Die Eigenschaft port eines RTCIceCandidate enthält die Portnummer des Transportendpunkts, den der Kandidat beschreibt. Zusammen mit address und protocol ergibt sie die vollständige Netzwerkadresse, über die ein Peer erreichbar ist. Der Wert wird aus dem candidate-String (SDP-Attribut a=candidate) gelesen und lässt sich nicht direkt setzen.
Welche Bedeutung der Port hat, hängt vom Kandidatentyp (type) ab:
host: lokaler Port auf dem Gerät selbst.srflx(server-reflexiv): der Port, den ein STUN-Server von außen sieht, also nach der NAT-Übersetzung.prflx(peer-reflexiv): der Port, der bei Konnektivitätsprüfungen mit dem Peer erkannt wurde.relay: der Port, den ein TURN-Server für die Weiterleitung vergeben hat.
Man braucht port vor allem zur Fehlersuche, für Verbindungsstatistiken oder zum Filtern von Kandidaten, etwa um zu prüfen, ob ein bestimmter TURN-Port verwendet wird. Die zugehörige Basisadresse steht bei nicht-host-Kandidaten in relatedAddress und relatedPort.
Rückgabewert
null, wenn der Kandidat keinen gültigen candidate-String enthält bzw. der Port nicht ermittelt werden konnte.Beispiele
Port aus einem Kandidaten-String lesen
const candidate = new RTCIceCandidate({
candidate: 'candidate:842163049 1 udp 1677729535 203.0.113.7 54321 typ srflx raddr 192.168.1.20 rport 50000',
sdpMid: '0',
sdpMLineIndex: 0
});
console.log(candidate.address, candidate.port);
console.log('Basis-Port:', candidate.relatedPort);
Lokal gesammelte Kandidaten mit Port 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}`);
});
pc.createDataChannel('test');
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Nur TURN-Kandidaten auf Port 443 weitergeben
const sendToSignaling = (c) => console.log('Sende:', c.candidate);
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'turns:turn.example.com:443', username: 'user', credential: 'secret' }]
});
pc.onicecandidate = ({ candidate }) => {
// Nur Relay-Kandidaten auf Port 443 akzeptieren (z. B. restriktive Firewall)
if (candidate?.type === 'relay' && candidate.port === 443) {
sendToSignaling(candidate);
}
};
// Wichtig · Fallstricke
- Datenschutz: Browser verbergen die lokalen IP-Adressen von
host-Kandidaten oft hinter mDNS-Namen (….local). Der Port bleibt trotzdem sichtbar. Ports und Adressen gehören zum Netzwerk-Fingerprint, deshalb sollten sie nicht ungefiltert protokolliert oder an Dritte gesendet werden. - Bei TCP-Kandidaten mit
tcpType"active"ist der Port häufig9(Discard-Port). Er dient nur als Platzhalter, weil die Verbindung ausgehend aufgebaut wird. - Der Wert kann
nullsein, zum Beispiel bei einem Kandidaten mit leeremcandidate-String, der das Ende der Sammlung markiert. Vor Vergleichen deshalb prüfen. - Bei
srflx- undrelay-Kandidaten istportder öffentliche bzw. vom Relay vergebene Port. Den lokalen Basis-Port liefertrelatedPort. - Ältere Browser (Firefox vor Version 68, Chrome vor Version 74) stellen die Eigenschaft nicht bereit. Dort muss man den Port selbst aus
candidate.candidateauslesen: Er ist das sechste durch Leerzeichen getrennte Feld.