// Start is called before the first frame update
    void Start()
    {
        Debug.Log(QuicheVersion.GetVersion());
        QuicheDebug.EnableDebugLogging((line, argp) => {
            Debug.Log(line);
        });
        var localAddress = IPAddress.Parse(localIpString);
        var localEP      = new IPEndPoint(localAddress, localPort);

        udpClient = new UdpClient(localEP);
        var config = new QuicheConfig(QuicheVersion.QUICHE_PROTOCOL_VERSION);

        byte[] protos = Encoding.ASCII.GetBytes("\x05hq-24\x05hq-23\x08http/0.9");
        config.LoadCertChainFromPemFile($"{Application.dataPath}/Server/cert.crt");
        config.LoadPrivKeyFromPemFile($"{Application.dataPath}/Server/cert.key");
        config.SetApplicationProtos(protos);
        config.SetIdleTimeout(5000);
        config.SetMaxPacketSize(QuicheClient.MAX_DATAGRAM_SIZE);
        config.SetInitialMaxData(10000000);
        config.SetInitialMaxStreamDataBidiLocal(1000000);
        config.SetInitialMaxStreamDataBidiRemote(1000000);
        config.SetInitialMaxStreamDataUni(1000000);
        config.SetInitialMaxStreamsBidi(100);
        config.SetInitialMaxStreamsUni(100);
        config.SetDisableActiveMigration(true);
        if (earlyData)
        {
            config.EnableEarlyData();
        }
        quiche = new QuicheListener(config);
    }
 void OnDestroy()
 {
     foreach (var key in clients.Keys)
     {
         var client = clients[key];
         client.Connection.Dispose();
     }
     clients.Clear();
     if (quiche != null)
     {
         quiche.Dispose();
         quiche = null;
     }
     if (udpClient != null)
     {
         udpClient.Dispose();
         udpClient = null;
     }
 }