Exemple #1
0
 public void Disconnect()
 {
     CtkUtil.DisposeTaskTry(this.runningTask);
     CtkNetUtil.DisposeTcpClientTry(this.MyTcpClient);
     this.OnDisconnect(new CtkNonStopTcpStateEventArgs()
     {
         Message = "Disconnect method is executed"
     });
 }
Exemple #2
0
        public int ConnectTry()
        {
            try
            {
                if (!Monitor.TryEnter(this, 1000))
                {
                    return(-1);                              //進不去先離開
                }
                if (!mreIsConnecting.WaitOne(10))
                {
                    return(0);                //連線中就離開
                }
                this.mreIsConnecting.Reset(); //先卡住, 不讓後面的再次進行連線

                //在Lock後才判斷, 避免判斷無連線後, 另一邊卻連線好了
                if (this.MyTcpClient != null && this.MyTcpClient.Connected)
                {
                    return(0);                                                       //連線中直接離開
                }
                if (this.MyTcpClient != null)
                {
                    CtkNetUtil.DisposeTcpClientTry(this.MyTcpClient);
                    this.MyTcpClient = null;
                }


                IPAddress ip = null;
                if (this.LocalUri != null && IPAddress.TryParse(this.LocalUri.Host, out ip))
                {
                    this.MyTcpClient = new TcpClient(new IPEndPoint(ip, this.LocalUri.Port));
                }
                else
                {
                    this.MyTcpClient = new TcpClient();
                }

                this.MyTcpClient.NoDelay = true;
                this.MyTcpClient.Connect(this.RemoteUri.Host, this.RemoteUri.Port);

                return(0);
            }
            catch (Exception ex)
            {
                //停止連線
                this.Disconnect();
                throw ex;
            }
            finally
            {
                //同步作業, 最後要解除連線鎖
                this.mreIsConnecting.Set();
                if (Monitor.IsEntered(this))
                {
                    Monitor.Exit(this);
                }
            }
        }