Signatur
Beschreibung
Die schreibgeschützte Eigenschaft port eines RTCPeerConnectionIceErrorEvent gibt die lokale Portnummer an, über die der ICE-Agent versucht hat, mit einem STUN- oder TURN-Server zu sprechen. Das Event wird als icecandidateerror auf einer RTCPeerConnection ausgelöst, wenn beim Sammeln von ICE-Kandidaten ein Fehler auftritt, zum Beispiel wenn ein Server nicht erreichbar ist oder die TURN-Anmeldung scheitert.
Zusammen mit address beschreibt port den lokalen Endpunkt, von dem die fehlgeschlagene Anfrage ausging. Den eigentlichen Server findet man in url, die Fehlerursache in errorCode und errorText. Mit allen Werten zusammen lässt sich gut nachvollziehen, welche Netzwerkschnittstelle und welcher Server betroffen waren.
Ist die lokale Adresse aus Datenschutzgründen nicht freigegeben (etwa wenn keine Host-Kandidaten veröffentlicht werden, weil mDNS-Verschleierung aktiv ist oder keine Kamera-/Mikrofonfreigabe erteilt wurde), ist port genau wie address null.
Rückgabewert
unsigned short, 0–65535) mit dem lokalen Port oder null, wenn die lokale Adresse nicht offengelegt wird.Beispiele
ICE-Fehler mit lokalem Port protokollieren
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.example.org:3478' }]
});
pc.addEventListener('icecandidateerror', (event) => {
const local = event.port !== null
? `${event.address}:${event.port}`
: '(lokale Adresse verborgen)';
console.warn(`ICE-Fehler ${event.errorCode} bei ${event.url} von ${local}: ${event.errorText}`);
});
// Kandidatensuche anstoßen
pc.createDataChannel('probe');
pc.createOffer().then((offer) => pc.setLocalDescription(offer));
Fehler nach lokalem Port gruppieren (on-Property)
const pc = new RTCPeerConnection({
iceServers: [
{ urls: 'turn:turn.example.org:3478', username: 'user', credential: 'falsch' }
]
});
const fehlerProPort = new Map();
pc.onicecandidateerror = (event) => {
const key = event.port ?? 'unbekannt';
const liste = fehlerProPort.get(key) ?? [];
liste.push({ code: event.errorCode, url: event.url });
fehlerProPort.set(key, liste);
};
pc.onicegatheringstatechange = () => {
if (pc.iceGatheringState === 'complete') {
console.table([...fehlerProPort].map(([port, e]) => ({ port, anzahl: e.length })));
}
};
pc.createDataChannel('probe');
pc.createOffer().then((o) => pc.setLocalDescription(o));
Diagnosedaten an einen Server senden
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.example.org' }] });
const onIceError = async (event) => {
await fetch('/api/webrtc-diagnose', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
server: event.url,
localPort: event.port, // kann null sein
code: event.errorCode,
text: event.errorText
})
});
};
pc.addEventListener('icecandidateerror', onIceError);
// Später, z. B. nach Verbindungsaufbau, wieder entfernen
// pc.removeEventListener('icecandidateerror', onIceError);
// Wichtig · Fallstricke
- Lokaler Port, nicht der Server-Port:
portist der Port auf der eigenen Seite. Den Port des STUN/TURN-Servers liest du ausurl(z. B.turn:host:3478) heraus. - Kann
nullsein: Wird die lokale IP aus Datenschutzgründen verborgen (mDNS-Kandidaten, fehlende Mediengeräte-Freigabe), sindportundaddressbeidenull. Prüfe darauf, bevor du Werte zusammensetzt. - Nicht jeder Fehler ist schlimm:
icecandidateerrorkann bei mehreren Servern oder Schnittstellen öfter ausgelöst werden, obwohl die Verbindung am Ende trotzdem zustande kommt. Ob es wirklich ein Problem gibt, zeigt ersticeConnectionState. - Datenschutz: Lokale Adressen und Ports zählen zu den Daten, mit denen sich Nutzer wiedererkennen lassen (Fingerprinting). Übertrage sie nur, wenn es nötig ist, und nur mit Einwilligung.
- Kompatibilität: Chromium-Browser und Safari unterstützen das Event. In Firefox war die Unterstützung lange unvollständig, prüfe sie daher mit
'onicecandidateerror' in RTCPeerConnection.prototype. Die ältere EigenschafthostCandidateist veraltet. Verwende stattdessenaddressundport.