Example #1
0
        /// <summary>
        /// Remember use stream.Flush() to force data send, Tcp Client always write data into buffer.
        /// </summary>
        /// <param name="buff"></param>
        /// <param name="offset"></param>
        /// <param name="length"></param>
        public void WriteBytes(byte[] buff, int offset, int length)
        {
            if (this.MyTcpClient == null)
            {
                return;
            }
            if (!this.MyTcpClient.Connected)
            {
                return;
            }


            try
            {
                var stm = this.MyTcpClient.GetStream();
                stm.Write(buff, offset, length);
                stm.Flush();
            }
            catch (Exception ex)
            {
                //資料寫入錯誤, 普遍是斷線造成, 先中斷連線清除資料
                this.Disconnect();
                CtkLog.WarnNs(this, ex);
            }
            //stm.BeginWrite(buff, offset, length, new AsyncCallback((ar) =>
            //{
            //    //CtkLog.WriteNs(this, "" + ar.IsCompleted);
            //}), this);
        }
Example #2
0
 public ComplexD[] FftForwardJustD(ComplexD[] input)
 {
     try
     {
         return(this.CudafyContext.FftForward(input));
     }
     catch (CtkCudafyCannotUseException ex)
     {
         IsUseCudafy = false;
         CtkLog.WarnNs(this, ex.StackTrace);
     }
     catch (Cudafy.CudafyCompileException ex)
     {
         IsUseCudafy = false;
         CtkLog.WarnNs(this, ex.StackTrace);
     }
     catch (System.ComponentModel.Win32Exception ex)
     {
         IsUseCudafy = false;
         CtkLog.WarnNs(this, ex.StackTrace);
     }
     catch (NotSupportedException ex)
     {
         IsUseCudafy = false;
         CtkLog.WarnNs(this, ex.StackTrace);
     }
     return(null);
 }
        /// <summary>
        /// Clinet Connect End
        /// </summary>
        /// <param name="ar"></param>
        void EndConnectCallback(IAsyncResult ar)
        {
            var myea      = new CtkNonStopTcpStateEventArgs();
            var trxBuffer = myea.TrxMessageBuffer;

            try
            {
                //Lock使用在短碼保護, 例如: 保護一個變數的get/set
                //Monitor使用在保護一段代碼

                Monitor.Enter(this);                 //一定要等到進去
                var state = (CtkTcpSocket)ar.AsyncState;
                state.WorkSocket = state.ConnSocket; //作為Client時, Work = Conn

                var client = state.WorkSocket;
                client.EndConnect(ar);

                myea.Sender     = state;
                myea.WorkSocket = client;
                if (!ar.IsCompleted || client == null || !client.Connected)
                {
                    throw new CtkException("Connection Fail");
                }


                //呼叫他人不應影響自己運作, catch起來
                try { this.OnFirstConnect(myea); }
                catch (Exception ex) { CtkLog.WarnNs(this, ex); }

                if (this.IsAsynAutoReceive)
                {
                    client.BeginReceive(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveCallback), myea);
                }
            }
            //catch (SocketException ex) { }
            catch (Exception ex)
            {
                //失敗就中斷連線, 清除
                this.Disconnect();
                myea.Message   = ex.Message;
                myea.Exception = ex;
                this.OnFailConnect(myea);
                CtkLog.WarnNs(this, ex);
            }
            finally
            {
                try { this.mreIsConnecting.Set(); /*同步型的, 結束就可以Set*/ }
                catch (ObjectDisposedException) { }
                Monitor.Exit(this);
            }
        }
Example #4
0
        void EndConnectCallback(IAsyncResult ar)
        {
            var myea      = new CtkNonStopTcpStateEventArgs();
            var trxBuffer = myea.TrxMessageBuffer;

            try
            {
                //Lock使用在短碼保護, 例如: 保護一個變數的get/set
                //Monitor使用在保護一段代碼

                Monitor.Enter(this);//一定要等到進去
                var state  = (CtkTcpClient)ar.AsyncState;
                var client = state.MyTcpClient;
                client.EndConnect(ar);

                myea.Sender        = state;
                myea.WorkTcpClient = client;
                if (!ar.IsCompleted || client.Client == null || !client.Connected)
                {
                    throw new CtkException("Connection Fail");
                }

                //呼叫他人不應影響自己運作, catch起來
                try { this.OnFirstConnect(myea); }
                catch (Exception ex) { CtkLog.WarnNs(this, ex); }

                if (this.IsAsynAutoRead)
                {
                    var stream = client.GetStream();
                    stream.BeginRead(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length, new AsyncCallback(EndReadCallback), myea);
                }
            }
            //catch (SocketException ex) { }
            catch (Exception ex)
            {
                //失敗就中斷連線, 清除
                this.Disconnect();
                myea.Message   = ex.Message;
                myea.Exception = ex;
                this.OnFailConnect(myea);
                CtkLog.WarnNs(this, ex);
            }
            finally
            {
                this.mreIsConnecting.Set();
                Monitor.Exit(this);
            }
        }
Example #5
0
 public virtual int CfRunOnce()
 {
     try
     {
         this.ProtoConn.ConnectIfNo();//內部會處理重複要求連線
         this.RealExec();
     }
     catch (Exception ex)
     {
         CtkLog.WarnNs(this, ex);
         if (this.Config != null)
         {
             var mymsg = string.Format("Loca={0}, Remote={1}, DeviceUid={2}", this.Config.LocalUri, this.Config.RemoteUri, this.Config.DeviceUid);
             CtkLog.WarnNs(this, mymsg);
         }
         Thread.Sleep(3000);//異常斷線後, 先等3秒再繼續
     }
     return(0);
 }
        public void WriteMsg(CtkProtocolTrxMessage msg)
        {
            try
            {
                //寫入不卡Monitor, 並不會造成impact
                //但如果卡了Monitor, 你無法同時 等待Receive 和 要求Send

                //其它作業可以卡 Monitor.TryEnter
                //此物件會同時進行的只有 Receive 和 Send
                //所以其它作業卡同一個沒問題: Monitor.TryEnter(this, 1000)

                var buffer = msg.ToBuffer();
                this.WorkSocket.Send(buffer.Buffer, buffer.Offset, buffer.Length, SocketFlags.None);
            }
            catch (Exception ex)
            {
                this.Disconnect(); //寫入失敗就斷線
                CtkLog.WarnNs(this, ex);
                throw ex;          //就例外就拋出, 不吃掉
            }
        }
Example #7
0
        void EndReadCallback(IAsyncResult ar)
        {
            //var stateea = (CtkNonStopTcpStateEventArgs)ar.AsyncState;
            var myea = (CtkNonStopTcpStateEventArgs)ar.AsyncState;

            try
            {
                var client = myea.WorkTcpClient;
                if (!ar.IsCompleted || client == null || client.Client == null || !client.Connected)
                {
                    throw new CtkException("Read Fail");
                }

                var           ctkBuffer = myea.TrxMessageBuffer;
                NetworkStream stream    = client.GetStream();
                int           bytesRead = stream.EndRead(ar);
                ctkBuffer.Length = bytesRead;
                //呼叫他人不應影響自己運作, catch起來
                try { this.OnDataReceive(myea); }
                catch (Exception ex) { CtkLog.Write(ex); }

                if (this.IsAsynAutoRead)
                {
                    stream.BeginRead(ctkBuffer.Buffer, 0, ctkBuffer.Buffer.Length, new AsyncCallback(EndReadCallback), myea);
                }
            }
            //catch (IOException ex) { CtkLog.Write(ex); }
            catch (Exception ex)
            {
                //讀取失敗, 中斷連線(會呼叫 OnDisconnect), 不需要呼叫 OnFailConnect
                this.Disconnect();
                myea.Message   = ex.Message;
                myea.Exception = ex;
                this.OnErrorReceive(myea);//但要呼叫 OnErrorReceive
                CtkLog.WarnNs(this, ex);
            }
        }
Example #8
0
        public void Write(List <double> dataList, DateTime?time = null)
        {
            if (dataList.Count <= 0)
            {
                return;
            }
            var now = DateTime.Now;

            if (time != null)
            {
                now = time.Value;
            }
            var nowUtc = now.ToUniversalTime();//寫資料, 要求傳入Utc

            //每分鐘 -> 實際儲存
            var fn     = string.Format("dt{0}.signal.lock", now.ToString("yyyyMMddHHmm"));
            var dir    = Path.Combine(this.Config.DirectoryPath, "dt" + now.ToString("yyyyMMdd"));
            var currfp = Path.Combine(dir, fn);
            var currfi = new FileInfo(currfp);


            try
            {
                //一秒內要進入
                if (!Monitor.TryEnter(this, 1000))
                {
                    CtkLog.WarnNs(this, "時限內無法進入Signal file create");
                    return;
                }
                //檔名是否需要置換了
                if (this.fwriter == null || this.fi.FullName != currfi.FullName)
                {
                    var lockFp    = this.fi == null ? null : this.fi.FullName;
                    var nonLockFp = lockFp == null ? null : Regex.Replace(lockFp, @"\.lock$", "");

                    //先關掉舊檔
                    if (this.fwriter != null)
                    {
                        this.CloseStream(ref this.fwriter);
                    }

                    //再Reanme, 將檔案的.lock移除
                    if (lockFp != nonLockFp)
                    {
                        File.Move(lockFp, nonLockFp);
                    }

                    //不等待Event的工作, 避免來不及寫入
                    Task.Factory.StartNew(() =>
                    {
                        this.OnFileChanged(new SNetFileStorageEventArgs()
                        {
                            PrevFilePath = nonLockFp,
                            CurrFilePath = currfi.FullName,
                        });
                    });

                    this.fi = currfi;
                    if (!this.fi.Directory.Exists)
                    {
                        this.fi.Directory.Create();
                    }
                    this.fwriter = new StreamWriter(currfi.FullName, false, Encoding.UTF8);//操作用 lock 檔
                    this.fsInfo.WriteHeader(this.fwriter);
                }
                //檔案是當前時區
                this.fsInfo.WriteValues(this.fwriter, nowUtc, dataList);

                this.fwriter.Flush();

                this.DeleteOld();
            }
            finally { Monitor.Exit(this); }
        }