Beispiel #1
0
 void OnFirstConnect(CtkProtocolEventArgs ea)
 {
     if (this.EhFirstConnect == null)
     {
         return;
     }
     this.EhFirstConnect(this, ea);
 }
Beispiel #2
0
 void OnErrorReceive(CtkProtocolEventArgs ea)
 {
     if (this.EhErrorReceive == null)
     {
         return;
     }
     this.EhErrorReceive(this, ea);
 }
Beispiel #3
0
 void OnDisconnect(CtkProtocolEventArgs ea)
 {
     if (this.EhDisconnect == null)
     {
         return;
     }
     this.EhDisconnect(this, ea);
 }
Beispiel #4
0
 void OnFirstConnect(CtkProtocolEventArgs tcpstate)
 {
     if (this.EhFirstConnect == null)
     {
         return;
     }
     this.EhFirstConnect(this, tcpstate);
 }
        public int ReceiveOnce()
        {
            try
            {
                if (!Monitor.TryEnter(this, 1000))
                {
                    return(-1);                              //進不去先離開
                }
                if (!this.mreIsReceiving.WaitOne(10))
                {
                    return(0);               //接收中先離開
                }
                this.mreIsReceiving.Reset(); //先卡住, 不讓後面的再次進行

                var ea = new CtkProtocolEventArgs()
                {
                    Sender = this,
                };

                ea.TrxMessage = new CtkProtocolBufferMessage(1518);
                var trxBuffer = ea.TrxMessage.ToBuffer();


                trxBuffer.Length = this.WorkSocket.Receive(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length, SocketFlags.None);
                if (trxBuffer.Length == 0)
                {
                    return(-1);
                }
                this.OnDataReceive(ea);
            }
            catch (Exception ex)
            {
                this.OnErrorReceive(new CtkProtocolEventArgs()
                {
                    Message = "Read Fail"
                });
                //當 this.ConnSocket == this.WorkSocket 時, 代表這是 client 端
                this.Disconnect();
                if (this.ConnSocket != this.WorkSocket)
                {
                    CtkNetUtil.DisposeSocketTry(this.WorkSocket); //執行出現例外, 先釋放Socket
                }
                throw ex;                                         //同步型作業, 直接拋出例外, 不用寫Log
            }
            finally
            {
                try { this.mreIsReceiving.Set(); /*同步型的, 結束就可以Set*/ }
                catch (ObjectDisposedException) { }
                if (Monitor.IsEntered(this))
                {
                    Monitor.Exit(this);
                }
            }
            return(0);
        }
Beispiel #6
0
        /// <summary>
        /// Syncnized Read Once
        /// </summary>
        /// <returns></returns>
        public int ReadOnce()
        {
            try
            {
                if (!Monitor.TryEnter(this, 1000))
                {
                    return(-1);                              //進不去先離開
                }
                if (!this.mreIsReading.WaitOne(10))
                {
                    return(0);             //接收中先離開
                }
                this.mreIsReading.Reset(); //先卡住, 不讓後面的再次進行

                var ea = new CtkProtocolEventArgs()
                {
                    Sender = this,
                };

                ea.TrxMessage = new CtkProtocolBufferMessage(1518);
                var trxBuffer = ea.TrxMessage.ToBuffer();

                var stream = this.MyTcpClient.GetStream();
                trxBuffer.Length = stream.Read(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length);
                if (trxBuffer.Length == 0)
                {
                    return(-1);
                }
                this.OnDataReceive(ea);
            }
            catch (Exception ex)
            {
                this.OnErrorReceive(new CtkProtocolEventArgs()
                {
                    Message = "Read Fail"
                });
                this.Disconnect(); //讀取失敗先斷線
                throw ex;          //同步型作業, 直接拋出例外, 不用寫Log
            }
            finally
            {
                this.mreIsReading.Set();//同步型的, 結束就可以Set
                if (Monitor.IsEntered(this))
                {
                    Monitor.Exit(this);
                }
            }
            return(0);
        }