Esempio n. 1
0
 /// <summary>
 /// 触发网络错误事件
 /// </summary>
 /// <param name="state"></param>
 private void RaiseNetError(AsyncUDPState state)
 {
     if (NetError != null)
     {
         NetError(this, new ScadaUDPEventArgs(state));
     }
 }
Esempio n. 2
0
 private void RaiseDataReceived(AsyncUDPState state, byte[] buffer)
 {
     DataReceived?.Invoke(this,
                          ServerType == UDPServerType.ASCII
             ? new ScadaUDPEventArgs(new ScadaStrBody(buffer, state.remote), state)
             : new ScadaUDPEventArgs(new ScadaUDPBody(buffer, state.remote), state));
 }
Esempio n. 3
0
 /// <summary>
 /// 触发数据发送完毕的事件
 /// </summary>
 /// <param name="state"></param>
 private void RaiseCompletedSend(AsyncUDPState state)
 {
     if (CompletedSend != null)
     {
         CompletedSend(this, new ScadaUDPEventArgs(state));
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 同步接收数据的方法
        /// </summary>
        /// <param name="ar"></param>
        private void ReceiveData()
        {
            IPEndPoint remote = null;

            while (true)
            {
                byte[] buffer = null;
                try
                {
                    buffer = _server.Receive(ref remote);
                }
                catch (Exception e)
                {
                    RaiseNetError(null, e);
                    return;
                }
                if (buffer == null || buffer.Length == 0)
                {
                    return;
                }

                AsyncUDPState udpReceiveState = new AsyncUDPState();
                udpReceiveState.remote    = remote;
                udpReceiveState.udpClient = _server;
                RaiseDataReceived(udpReceiveState, buffer);
            }
        }
Esempio n. 5
0
 /// <summary>
 /// 关闭一个与客户端之间的会话
 /// </summary>
 /// <param name="state">需要关闭的客户端会话对象</param>
 public void Close(AsyncUDPState state)
 {
     if (state != null)
     {
         //_clients.Remove(state);
         //_clientCount--;
     }
 }
Esempio n. 6
0
        /// <summary>
        /// 接收数据的方法
        /// </summary>
        /// <param name="ar"></param>
        private void ReceiveDataAsync(IAsyncResult ar)
        {
            AsyncUDPState udpState = ar.AsyncState as AsyncUDPState;
            IPEndPoint    remote   = null;

            byte[] buffer = null;
            try
            {
                if (ar.IsCompleted)
                {
                    buffer = _server.EndReceive(ar, ref remote);
                    if (ServerType == UDPServerType.ASCII)
                    {
                        string receiveString = Encoding.ASCII.GetString(buffer);
                        LOG.InfoFormat("({4}) Received {0}:{1},len:{2},body:{3}", remote.Address, remote.Port, buffer.Length, receiveString, Name);
                    }
                    else
                    {
                        LOG.InfoFormat("({3}) Received {0}:{1},len:{2}", remote.Address, remote.Port, buffer.Length, Name);
                    }
                    if (PrintHex)
                    {
                        PrintUtils.PrintHex(buffer);
                    }
                    udpState.remote = remote;
                    //触发数据收到事件
                    RaiseDataReceived(udpState, buffer);
                    //lock (this)
                    //{
                    //    if (IsRunning && _server != null)
                    //        _server.BeginReceive(new AsyncCallback(ReceiveDataAsync), udpState);
                    //}
                }
            }
            catch (Exception exception)
            {
                RaiseNetError(udpState, exception);
            }
            finally
            {
                lock (this)
                {
                    if (IsRunning && _server != null)
                    {
                        udpReceiveState = new AsyncUDPState();
                        _server.BeginReceive(ReceiveDataAsync, udpReceiveState);
                    }
                }
            }
        }
Esempio n. 7
0
        private void SendCallback(IAsyncResult ar)
        {
            AsyncUDPState state = ar.AsyncState as AsyncUDPState;

            if (ar.IsCompleted)
            {
                try
                {
                    _server.EndSend(ar);
                    //消息发送完毕事件
                    RaiseCompletedSend(state);
                }
                catch (Exception)
                {
                    RaiseOtherException(state);
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 异步UdpClient UDP服务器
        /// </summary>
        /// <param name="localIPAddress">监听的IP地址</param>
        /// <param name="listenPort">监听的端口</param>
        /// <param name="maxClient">最大客户端数量</param>
        public ScadaUDPAsyncServer(IPAddress localIPAddress, int listenPort, int maxClient)
        {
            this.Address  = localIPAddress;
            this.Port     = listenPort;
            this.Encoding = Encoding.Default;

            MaxClient = maxClient;
            //_clients = new List<AsyncUDPSocketState>();
            _server = new UdpClient(new IPEndPoint(this.Address, this.Port));
            _server.Client.ReceiveBufferSize = ReceiveBufferSize;
            _server.Client.ReceiveTimeout    = 30;
            uint IOC_IN            = 0x80000000;
            uint IOC_VENDOR        = 0x18000000;
            uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;

            _server.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
            udpReceiveState           = new AsyncUDPState();
            udpReceiveState.udpClient = _server;
        }
Esempio n. 9
0
 private void RaiseOtherException(AsyncUDPState state)
 {
     RaiseOtherException(state, null);
 }
Esempio n. 10
0
 /// <summary>
 /// 触发异常事件
 /// </summary>
 /// <param name="state"></param>
 private void RaiseOtherException(AsyncUDPState state, Exception exception)
 {
     OtherException?.Invoke(this, new ScadaUDPEventArgs(exception, state));
 }
Esempio n. 11
0
 /// <summary>
 /// 触发网络错误事件
 /// </summary>
 /// <param name="state"></param>
 private void RaiseNetError(AsyncUDPState state, Exception exception)
 {
     NetError?.Invoke(this, new ScadaUDPEventArgs(exception, state));
 }
Esempio n. 12
0
 /// <summary>
 /// 触发数据发送完毕的事件
 /// </summary>
 /// <param name="state"></param>
 private void RaiseCompletedSend(AsyncUDPState state)
 {
     CompletedSend?.Invoke(this, new ScadaUDPEventArgs(state));
 }
Esempio n. 13
0
 /// <summary>
 /// 触发发送数据前的事件
 /// </summary>
 /// <param name="state"></param>
 private void RaisePrepareSend(AsyncUDPState state)
 {
     PrepareSend?.Invoke(this, new ScadaUDPEventArgs(state));
 }
Esempio n. 14
0
 public ScadaUDPEventArgs(Exception exception, AsyncUDPState state)
 {
     Exception = exception;
     State     = state;
 }
Esempio n. 15
0
 public ScadaUDPEventArgs(ScadaUDPBody msg, AsyncUDPState state)
 {
     this.UdpBody = msg;
     this.State   = state;
     IsHandled    = false;
 }
Esempio n. 16
0
 public ScadaUDPEventArgs(AsyncUDPState state)
 {
     this.State = state;
     IsHandled  = false;
 }