public bool ClientInit(byte[] verificationCode, NetworkfConnection applyTo)
        {
            Log("waiting server hello...");
            lock (mtx) {
                while (!_hasReceivedServerHello)
                {
                    Monitor.Wait(mtx);
                }
            }
            Log("server hello received");
            var verifyMsg = new CltVerifyMessage();

            verifyMsg.verificationCode = verificationCode;
            _service.SendMessage(verifyMsg);
            Log("waiting verification result...");
            lock (mtx) {
                while (!_hasReceivedServerResult)
                {
                    Monitor.Wait(mtx);
                }
            }
            Log("verification result received");
            if (_verificationResult)
            {
                ReleaseService();
                applyTo.ApplyService(_service);
                applyTo.AddMessageReceiver(ServerReadyMessage.MESSAGE_TYPE, this);
                _service.SendMessage(new CltReadyMessage());
                Log("client ready has sent");
                Log("waiting server ready...");
                while (!_hasReceivedServerReady)
                {
                    Thread.Sleep(100);
                    applyTo.UpdateReceiver();
                }
                Log("server ready received");
                applyTo.RemoveMessageReceiver(ServerReadyMessage.MESSAGE_TYPE, this);
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public void ServerApplyConnection(NetworkfConnection applyTo)
        {
            var serMsg = new SerVerifyResultMessage();

            serMsg.result = applyTo != null;
            _service.SendMessage(serMsg);
            Log("verification result has sent");
            if (applyTo != null)
            {
                int tryCount = 0;
                Log("waiting client ready...");
                lock (mtx) {
                    while (!_hasReceivedClientReady && tryCount < _retryCount)
                    {
                        Monitor.Wait(mtx, _retryDelay);
                        ++tryCount;
                    }
                }
                if (!_hasReceivedClientReady)
                {
                    Log("broken client");
                    ReleaseService();
                    _service.TeardownService();
                    return;
                }
                Log("client ready received");
                ReleaseService();
                applyTo.ApplyService(_service);
                applyTo.SendMessage(new ServerReadyMessage());
            }
            else
            {
                ReleaseService();
                _service.TeardownService();
            }
        }