void OnFirstConnect(CtkProtocolEventArgs ea) { if (this.EhFirstConnect == null) { return; } this.EhFirstConnect(this, ea); }
void OnErrorReceive(CtkProtocolEventArgs ea) { if (this.EhErrorReceive == null) { return; } this.EhErrorReceive(this, ea); }
void OnDisconnect(CtkProtocolEventArgs ea) { if (this.EhDisconnect == null) { return; } this.EhDisconnect(this, ea); }
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); }
/// <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); }