コード例 #1
0
#pragma warning disable CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行
        private async Task ReadWorker_DoWork(CancellationToken token)
#pragma warning restore CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行
        {
            Action cleanup = () =>
            {
                _client?.Dispose();
                _client = null;
            };

            token.Register(cleanup);
            while (!token.IsCancellationRequested && _client.Client != null)
            {
                Packet packet = null;
                try
                {
                    packet = ReadPacket();
                }
                catch (SocketException se)
                {
                    //如果是网络异常,退出。
#if DEBUG
                    //Env1.Instance.ShowMessage($"desc={se.Message}\nStack={se.StackTrace}");
#endif
                    //如果在事件句柄里面DisposeTcpChannel,它会wait这个循环结束。而这里又在等待这个事件句柄执行完毕,所以就死锁了。
#pragma warning disable 4014
                    Task.Run(() =>
                    {
                        ErrorHappened?.Invoke(ErrorType.SocketError);
                    }, token);
#pragma warning restore 4014
                    break;
                }
                catch (Exception ex)
                {
                    Env.ShowMessage($"desc={ex.Message}\nStack={ex.StackTrace}");
                }

                if (packet != null)
                {
                    try
                    {
                        //Env.Logger.Log($"Packet received {packet}");
                        PacketReceived?.Invoke(packet);
                    }
                    catch (Exception e)
                    {
#if DEBUG
                        Env.ShowMessage("逻辑层处理消息异常。请检查\n" + e.Message + "\n" + e.StackTrace);
#else
                        Env.Logger.Log(e.StackTrace);
#endif
                    }
                }
            }            //end while
            cleanup();
            Env.Logger.Log("ReceiveMessage: Receiving thread end...");
        }
コード例 #2
0
ファイル: Command.cs プロジェクト: zl33842901/SqlEx
 private void CallEvent(string sqlString, Dictionary <string, object> param, string message)
 {
     try
     {
         var args = new SqlExEventArgs(sqlString, param, message);
         ErrorHappened?.Invoke(this, args);
     }
     catch { }
 }
コード例 #3
0
ファイル: Query.cs プロジェクト: zl33842901/DapperEx
 protected void CallEvent(string sqlString, TheDynamicParameters param, string message)
 {
     try
     {
         var args = new DapperExEventArgs(sqlString, param, message);
         ErrorHappened?.Invoke(this, args);
     }
     catch { }
 }
コード例 #4
0
        private void ReadWorker_DoWork(object sender, DoWorkEventArgs args)
        {
            var worker = sender as BackgroundWorker;

            if (worker == null)
            {
                return;
            }

            Env.Instance.Logger.Trace("ReceiveMessage: Receiving thread start...");
            IsWorking = true;

            while (!worker.CancellationPending && client.Client != null)
            {
                Packet packet = null;
                try
                {
                    packet = ReadPacket();
                }
                catch (SocketException se)
                {
                    //如果是网络异常,退出。
#if DEBUG
                    //Env.Instance.ShowMessage($"desc={se.Message}\nStack={se.StackTrace}");
#endif
                    ErrorHappened?.Invoke(ErrorType.SocketError);
                    break;
                }
                catch (Exception ex)
                {
                    Env.Instance.ShowMessage($"desc={ex.Message}\nStack={ex.StackTrace}");
                }

                if (packet != null)
                {
                    try
                    {
                        PacketReceived?.Invoke(packet);
                    }
                    catch (Exception e)
                    {
#if DEBUG
                        Env.Instance.ShowMessage("逻辑层处理消息异常。请检查\n" + e.Message + "\n" + e.StackTrace);
#else
                        Env.Instance.Logger.Error(e);
#endif
                    }
                }
            }//end while
            IsWorking = false;
            Env.Instance.Logger.Trace("ReceiveMessage: Receiving thread end...");
        }
コード例 #5
0
 public void Close()
 {
     if (client != null)
     {
         try
         {
             client.Close();
         }
         catch (Exception e) {
             ErrorHappened?.Invoke(e.ToString());
         }
     }
 }
コード例 #6
0
        public async void WriteTestAsync()
        {
            if (client != null && GetState(client) == TcpState.Established)
            {
                byte[] pocket  = Encoding.ASCII.GetBytes(counter.ToString("D4"));
                var    message = testMessage;
                if (message.Length > (SIZE - pocket.Length))
                {
                    message = message.Remove(SIZE - pocket.Length);
                }
                byte[] array = Encoding.ASCII.GetBytes(message);
                byte[] data  = new byte[SIZE];
                pocket.CopyTo(data, 0);
                array.CopyTo(data, pocket.Length);
                data[SIZE - 1] = Encoding.ASCII.GetBytes("\r")[0];
                data[SIZE - 2] = Encoding.ASCII.GetBytes("\n")[0];
                try
                {
                    var ws = client.GetStream();

                    await ws.WriteAsync(data, 0, data.Length).ConfigureAwait(false);

                    //await ws.WriteAsync(data, 0, data.Length);
                    await ws.FlushAsync().ConfigureAwait(false);

                    while (client.Available > 0)
                    {
                        var rs = client.GetStream();

                        //await rs.ReadAsync(data, 0, data.Length);
                        await rs.ReadAsync(data, 0, data.Length).ConfigureAwait(false);

                        //await ws.FlushAsync().ConfigureAwait(false);
                    }
                }
                catch (Exception e)
                {
                    ErrorHappened?.Invoke(e.ToString());
                }
                counter = counter >= 9999 ? 0 : ++counter;
            }
            else
            {
                ErrorHappened?.Invoke("Connection is empty.");
            }
        }
コード例 #7
0
ファイル: TCPServer.cs プロジェクト: DTadescu/TCPiperServer
        public void AcceptTCPClient()
        {
            if (server != null)
            {
                server.Start();


                try
                {
                    client = new Client.TCPClientWorker(server.AcceptTcpClient());
                    client.ErrorHappened += OnErrorHappened;
                }
                catch (Exception e)
                {
                    ErrorHappened?.Invoke(e.ToString());
                }
            }
        }
コード例 #8
0
        public void Send(Packet packet)
        {
            try
            {
                byte[] buffer = packet.ToBytes(Crypto);

                if (buffer == null)
                {
                    return;
                }
                ////TODO 应该检查packet的长度,禁止发送太大的packet,强制上层发送大对象的时候用SequencableItem.
                int sentCount = 0;
                do
                {
                    sentCount += client.Client.Send(buffer, sentCount, buffer.Length - sentCount, SocketFlags.None);
                } while (sentCount < buffer.Length);
            }
            catch (Exception e)
            {
                ErrorHappened?.Invoke(ErrorType.SocketError);
            }
        }
コード例 #9
0
 public void Error(string message) => ErrorHappened?.Invoke(this, new MessageEventArgs()
 {
     Message = message
 });
コード例 #10
0
        //Mutex appModelMutex;

        private AppModel(Env container)
        {
            //container.Logger.Error("Test Log");
            var cfg = Env.Instance.Config;

            Devices       = new HashSet <Device>();
            Conversations = new Dictionary <string, Conversation>();
            LocalDevice   = cfg.LocalDevice;
            var sm = Env.Instance.SecurityManager;
            var localConnectCode = sm.LoadString(SecurityManager.LOCAL_CONNECT_CODE);

            if (localConnectCode == null)
            {
                localConnectCode = StringHelper.NewRandomPassword();
                sm.SaveString(SecurityManager.LOCAL_CONNECT_CODE, localConnectCode);
            }
            LocalDevice.ConnectCode = localConnectCode;
            LocalDevice.DeviceType  = container.DeviceType;
            container.InitLocalDeviceIPAdress(LocalDevice);



            ChannelManager = new ChannelManager(ChannelPort);
            ChannelManager.ChannelCreated += (channel) =>
            {
                Action <Packet> packetReceiver = null;
                packetReceiver = (Packet packet) =>
                {
                    Message        message = Message.FromPacket(packet);
                    ConnectMessage cm      = message as ConnectMessage;
                    //一个新连接的socket,在发送ConnectMessage之前发送其它Message,是不会理会的。
                    if (cm != null)
                    {
                        channel.PacketReceived -= packetReceiver;
                        var device = AddOrUpdateDevice(cm.Device);
                        if (device != null)
                        {
                            if (PacketHeader.DefaultVersion == packet.Header.version)
                            {
                                device.OnConnectMessageReceived(channel, cm);
                            }
                            else
                            {
                                device.CallPacketProtocolVersionError(PacketHeader.DefaultVersion > packet.Header.version);
                            }
                        }
                    }
                    ;
                };
                channel.PacketReceived += packetReceiver;
            };
            ChannelManager.PortOccupiedError += (int port) =>
            {
                Error error = new Error(Error.PortOccupied);
                error.AddError("port", port);
                ErrorHappened?.Invoke(error);
            };

            Discoverer = new LANDiscoverer(LocalDevice, DiscoverPort);
            container.NetworkChanged += (ips) =>
            {
                if (!string.IsNullOrEmpty(ips))
                {
                    container.InitLocalDeviceIPAdress(LocalDevice);
                    Discoverer.StartBroadcast();
                }
            };
        }
コード例 #11
0
ファイル: XSpi.cs プロジェクト: zhuzhenping/QuantBoxXProvider
 void IXSpi.ProcessError(ErrorField error)
 {
     ErrorHappened?.Invoke(this, error);
 }
コード例 #12
0
ファイル: TCPServer.cs プロジェクト: DTadescu/TCPiperServer
 private void OnErrorHappened(string message)
 {
     ErrorHappened?.Invoke(message);
 }