private RTCPeerConnection Createpc() { List <RTCCertificate> presetCertificates = null; if (File.Exists(LOCALHOST_CERTIFICATE_PATH)) { var localhostCert = new X509Certificate2(LOCALHOST_CERTIFICATE_PATH, (string)null, X509KeyStorageFlags.Exportable); presetCertificates = new List <RTCCertificate> { new RTCCertificate { Certificate = localhostCert } }; } RTCConfiguration pcConfiguration = new RTCConfiguration { certificates = presetCertificates, }; var pc = new RTCPeerConnection(pcConfiguration); pc.GetRtpChannel().MdnsResolve = MdnsResolve; //pc.GetRtpChannel().OnStunMessageReceived += (msg, ep, isrelay) => logger.LogDebug($"{_peerName}: STUN message received from {ep}, message class {msg.Header.MessageClass}."); var dataChannel = pc.createDataChannel(_dataChannelLabel, null); dataChannel.onDatamessage -= DataChannel_onDatamessage; dataChannel.onDatamessage += DataChannel_onDatamessage; _dataChannels.Add(_dataChannelLabel, dataChannel); pc.onicecandidateerror += (candidate, error) => logger.LogWarning($"{_peerName}: Error adding remote ICE candidate. {error} {candidate}"); pc.oniceconnectionstatechange += (state) => logger.LogDebug($"{_peerName}: ICE connection state change to {state}."); pc.onconnectionstatechange += (state) => { logger.LogDebug($"{_peerName}: Peer connection state changed to {state}."); if (state == RTCPeerConnectionState.disconnected || state == RTCPeerConnectionState.failed) { pc.Close("remote disconnection"); } }; pc.onicecandidate += (candidate) => { if (pc.signalingState == RTCSignalingState.have_local_offer || pc.signalingState == RTCSignalingState.have_remote_offer) { OnIceCandidateAvailable?.Invoke(new RTCIceCandidateInit() { candidate = candidate.ToString(), sdpMid = candidate.sdpMid, sdpMLineIndex = candidate.sdpMLineIndex }); } }; pc.ondatachannel += (dc) => { dc.onopen += () => logger.LogDebug($"{_peerName}: Data channel now open label {dc.label}, stream ID {dc.id}."); dc.onDatamessage -= DataChannel_onDatamessage; dc.onDatamessage += DataChannel_onDatamessage; logger.LogDebug($"{_peerName}: Data channel created by remote peer, label {dc.label}, stream ID {dc.id}."); _dataChannels.Add(dc.label, dc); }; return(pc); }
private RTCPeerConnection Createpc() { List <RTCCertificate> presetCertificates = null; byte[] dummyCertBytes = Convert.FromBase64String(DUMMY_CERTIFICATE_BASE64); var dummyCert = new X509Certificate2(dummyCertBytes); presetCertificates = new List <RTCCertificate> { new RTCCertificate { Certificate = dummyCert } }; RTCConfiguration pcConfiguration = new RTCConfiguration { certificates = presetCertificates, //iceServers = new List<RTCIceServer> { new RTCIceServer { urls = "stun:stun.l.google.com:19302" } } iceServers = new List <RTCIceServer> { new RTCIceServer { urls = "stun:108.177.15.127:19302" } }, X_BindAddress = IPAddress.Any }; var pc = new RTCPeerConnection(pcConfiguration); //pc.GetRtpChannel().OnStunMessageReceived += (msg, ep, isrelay) => logger.LogDebug($"{_peerName}: STUN message received from {ep}, message class {msg.Header.MessageClass}."); var dataChannel = pc.createDataChannel(_dataChannelLabel, null); dataChannel.onDatamessage += DataChannel_onDatamessage; dataChannel.onmessage += DataChannel_onmessage; _dataChannels.Add(_dataChannelLabel, dataChannel); pc.onicecandidateerror += (candidate, error) => logger.LogWarning($"{_peerName}: Error adding remote ICE candidate. {error} {candidate}"); pc.oniceconnectionstatechange += (state) => logger.LogDebug($"{_peerName}: ICE connection state change to {state}."); pc.onconnectionstatechange += (state) => { logger.LogDebug($"{_peerName}: Peer connection state changed to {state}."); if (state == RTCPeerConnectionState.disconnected || state == RTCPeerConnectionState.failed) { pc.Close("remote disconnection"); } }; pc.onicecandidate += (candidate) => { if (pc.signalingState == RTCSignalingState.have_local_offer || pc.signalingState == RTCSignalingState.have_remote_offer) { OnIceCandidateAvailable?.Invoke(new RTCIceCandidateInit() { candidate = candidate.ToString(), sdpMid = candidate.sdpMid, sdpMLineIndex = candidate.sdpMLineIndex }); } }; pc.ondatachannel += (dc) => { dc.onopen += () => logger.LogDebug($"{_peerName}: Data channel now open label {dc.label}, stream ID {dc.id}."); dc.onDatamessage += DataChannel_onDatamessage; dc.onmessage += DataChannel_onmessage; logger.LogDebug($"{_peerName}: Data channel created by remote peer, label {dc.label}, stream ID {dc.id}."); _dataChannels.Add(dc.label, dc); }; return(pc); }