/// <summary> /// Runs a DTLS handshake test between two threads on a loopback address. The main motivation for /// this test was that the first DTLS handshake between this application and a client browser /// was often substantially slower and occasionally failed. By doing a loopback test the idea /// is that the internal OpenSSL state is initialised. /// </summary> private void DoDtlsHandshakeLoopbackTest() { IPAddress testAddr = IPAddress.Loopback; Socket svrSock = new Socket(testAddr.AddressFamily, SocketType.Dgram, ProtocolType.Udp); svrSock.Bind(new IPEndPoint(testAddr, 9000)); int svrPort = ((IPEndPoint)svrSock.LocalEndPoint).Port; DtlsHandshake svrHandshake = new DtlsHandshake(_dtlsCertificatePath, _dtlsKeyPath); //svrHandshake.Debug = true; var svrTask = Task.Run(() => svrHandshake.DoHandshakeAsServer((ulong)svrSock.Handle)); Socket cliSock = new Socket(testAddr.AddressFamily, SocketType.Dgram, ProtocolType.Udp); cliSock.Bind(new IPEndPoint(testAddr, 0)); cliSock.Connect(testAddr, svrPort); DtlsHandshake cliHandshake = new DtlsHandshake(); //cliHandshake.Debug = true; var cliTask = Task.Run(() => cliHandshake.DoHandshakeAsClient((ulong)cliSock.Handle, (short)testAddr.AddressFamily, testAddr.GetAddressBytes(), (ushort)svrPort)); bool result = Task.WaitAll(new Task[] { svrTask, cliTask }, TEST_DTLS_HANDSHAKE_TIMEOUT); cliHandshake.Shutdown(); svrHandshake.Shutdown(); cliSock.Close(); svrSock.Close(); }
/// <summary> /// Runs a DTLS handshake test between two threads on a loopback address. The main motivation for /// this test was that the first DTLS handshake between this application and a client browser /// was often substantially slower and occasionally failed. By doing a loopback test the idea /// is that the internal OpenSSL state is initialised. /// </summary> private static void DoDtlsHandshakeLoopbackTest() { IPAddress testAddr = IPAddress.Loopback; //var dtlsFingerprint = DTLS_CERTIFICATE_FINGERPRINT.Substring(DTLS_CERTIFICATE_FINGERPRINT.Length + 1).Trim().Replace(":", "").Replace(" ", ""); //var dtlsFingerprintBuffer = SIPSorcery.Sys.ByteBufferInfo.ParseHexStr(dtlsFingerprint); Socket svrSock = new Socket(testAddr.AddressFamily, SocketType.Dgram, ProtocolType.Udp); svrSock.Bind(new IPEndPoint(testAddr, 9000)); int svrPort = ((IPEndPoint)svrSock.LocalEndPoint).Port; DtlsHandshake svrHandshake = new DtlsHandshake(DTLS_CERTIFICATE_PATH, DTLS_KEY_PATH); svrHandshake.Debug = true; byte[] clientFingerprint = null; var svrTask = Task.Run(() => svrHandshake.DoHandshakeAsServer((ulong)svrSock.Handle, ref clientFingerprint)); Socket cliSock = new Socket(testAddr.AddressFamily, SocketType.Dgram, ProtocolType.Udp); cliSock.Bind(new IPEndPoint(testAddr, 0)); cliSock.Connect(testAddr, svrPort); DtlsHandshake cliHandshake = new DtlsHandshake(); cliHandshake.Debug = true; byte[] serverFingerprint = null; var cliTask = Task.Run(() => cliHandshake.DoHandshakeAsClient((ulong)cliSock.Handle, (short)testAddr.AddressFamily, testAddr.GetAddressBytes(), (ushort)svrPort, ref serverFingerprint)); bool result = Task.WaitAll(new Task[] { svrTask, cliTask }, TEST_DTLS_HANDSHAKE_TIMEOUT); cliHandshake.Shutdown(); svrHandshake.Shutdown(); cliSock.Close(); svrSock.Close(); }