Beispiel #1
0
        /// <summary>
        /// 数据接收回调函数
        /// </summary>
        /// <param name="ar"></param>
        private void ReceiveCallback(IAsyncResult ar)
        {
            UdpState udpState = ar.AsyncState as UdpState;

            if (ar.IsCompleted)
            {
                try
                {
                    var buffer = udpState.UdpClient.EndReceive(ar, ref udpState.IpEndPoint);
                    udpState.Buffer = buffer;
                    HandleDataReceived?.Invoke(this, udpState);
                }
                catch (Exception ex)
                {
                    HandleException?.Invoke(ex);
                }
                finally
                {
                    _serverDone.Set();
                    if (IsRunning && _udpServer != null)
                    {
                        Receive();
                    }
                }
            }
        }
Beispiel #2
0
        private void HandleDatagramReceived(IAsyncResult ar)
        {
            if (IsRunning)
            {
                TcpState      internalClient = (TcpState)ar.AsyncState;
                NetworkStream networkStream  = internalClient.NetworkStream;

                int numberOfReadBytes = 0;
                try
                {
                    numberOfReadBytes = networkStream.EndRead(ar);
                }
                catch
                {
                    numberOfReadBytes = 0;
                }

                if (numberOfReadBytes == 0)
                {
                    // 连接已关闭
                    lock (this.clients)
                    {
                        this.clients.Remove(internalClient);
                        HandleClientDisconnected?.Invoke(internalClient);
                        return;
                    }
                }

                // 接收到字节和触发事件通知
                byte[] receivedBytes = new byte[numberOfReadBytes];
                Buffer.BlockCopy(internalClient.Buffer, 0, receivedBytes, 0, numberOfReadBytes);
                HandleDataReceived?.Invoke(internalClient, receivedBytes);
                HandleTextReceived?.Invoke(internalClient, this.Encoding.GetString(receivedBytes, 0, receivedBytes.Length));

                // 继续侦听TCP数据报包
                networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient);
            }
        }