/// <summary> /// 触发网络错误事件 /// </summary> /// <param name="state"></param> private void RaiseNetError(AsyncUDPState state) { if (NetError != null) { NetError(this, new ScadaUDPEventArgs(state)); } }
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)); }
/// <summary> /// 触发数据发送完毕的事件 /// </summary> /// <param name="state"></param> private void RaiseCompletedSend(AsyncUDPState state) { if (CompletedSend != null) { CompletedSend(this, new ScadaUDPEventArgs(state)); } }
/// <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); } }
/// <summary> /// 关闭一个与客户端之间的会话 /// </summary> /// <param name="state">需要关闭的客户端会话对象</param> public void Close(AsyncUDPState state) { if (state != null) { //_clients.Remove(state); //_clientCount--; } }
/// <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); } } } }
private void SendCallback(IAsyncResult ar) { AsyncUDPState state = ar.AsyncState as AsyncUDPState; if (ar.IsCompleted) { try { _server.EndSend(ar); //消息发送完毕事件 RaiseCompletedSend(state); } catch (Exception) { RaiseOtherException(state); } } }
/// <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; }
private void RaiseOtherException(AsyncUDPState state) { RaiseOtherException(state, null); }
/// <summary> /// 触发异常事件 /// </summary> /// <param name="state"></param> private void RaiseOtherException(AsyncUDPState state, Exception exception) { OtherException?.Invoke(this, new ScadaUDPEventArgs(exception, state)); }
/// <summary> /// 触发网络错误事件 /// </summary> /// <param name="state"></param> private void RaiseNetError(AsyncUDPState state, Exception exception) { NetError?.Invoke(this, new ScadaUDPEventArgs(exception, state)); }
/// <summary> /// 触发数据发送完毕的事件 /// </summary> /// <param name="state"></param> private void RaiseCompletedSend(AsyncUDPState state) { CompletedSend?.Invoke(this, new ScadaUDPEventArgs(state)); }
/// <summary> /// 触发发送数据前的事件 /// </summary> /// <param name="state"></param> private void RaisePrepareSend(AsyncUDPState state) { PrepareSend?.Invoke(this, new ScadaUDPEventArgs(state)); }
public ScadaUDPEventArgs(Exception exception, AsyncUDPState state) { Exception = exception; State = state; }
public ScadaUDPEventArgs(ScadaUDPBody msg, AsyncUDPState state) { this.UdpBody = msg; this.State = state; IsHandled = false; }
public ScadaUDPEventArgs(AsyncUDPState state) { this.State = state; IsHandled = false; }