Start · Sprachen · JavaScript · Referenz · RTCPeerConnectionIceErrorEvent.port

RTCPeerConnectionIceErrorEvent.port

Eigenschaft

Nur lesbare Eigenschaft mit der lokalen Portnummer, über die der ICE-Agent mit dem STUN- oder TURN-Server kommuniziert hat, oder <code>null</code>.

seit JavaScript Chrome/Edge 77+, Safari 14.1+; Firefox: eingeschrä Kategorie: webapi

Signatur

RTCPeerConnectionIceErrorEvent.port

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

Typ
number | null
Beschreibung
Eine vorzeichenlose 16-Bit-Ganzzahl (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));
ICE-Fehler 701 bei stun:stun.example.org:3478 von 192.168.1.23:54012: STUN host lookup received error.

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));
┌─────────┬─────────┬────────┐ │ (index) │ port │ anzahl │ ├─────────┼─────────┼────────┤ │ 0 │ 54013 │ 1 │ └─────────┴─────────┴────────┘

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: port ist der Port auf der eigenen Seite. Den Port des STUN/TURN-Servers liest du aus url (z. B. turn:host:3478) heraus.
  • Kann null sein: Wird die lokale IP aus Datenschutzgründen verborgen (mDNS-Kandidaten, fehlende Mediengeräte-Freigabe), sind port und address beide null. Prüfe darauf, bevor du Werte zusammensetzt.
  • Nicht jeder Fehler ist schlimm: icecandidateerror kann bei mehreren Servern oder Schnittstellen öfter ausgelöst werden, obwohl die Verbindung am Ende trotzdem zustande kommt. Ob es wirklich ein Problem gibt, zeigt erst iceConnectionState.
  • 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 Eigenschaft hostCandidate ist veraltet. Verwende stattdessen address und port.