public void Start() { try { Logger.WriteDebug(MethodBase.GetCurrentMethod(), "Starting"); var stopWatch = new Stopwatch(); stopWatch.Start(); IsRunning = false; if (_decoderPort <= 0 || _decoderPort >= 65535) { Logger.WriteDebug($"{_decoderName}: Wrong setting -> decoderPort"); Disconnected.RaiseEvent(this, null); return; } //Raise event Connecting.RaiseEvent(this, null); if (TryStartListener() == false) { Logger.WriteDebug($"{_decoderName}: try to make url reservation"); NetAclChecker.AddAddress($"http://+:{_decoderPort}/"); if (TryStartListener() == false) { Logger.WriteDebug($"{_decoderName}: unable to start listener"); return; } } //Raise event Connected.RaiseEvent(this, null); IsRunning = true; stopWatch.Stop(); Logger.WriteDebug(MethodBase.GetCurrentMethod(), $"Started -> {stopWatch.Elapsed}"); } catch (Exception ex) { Logger.WriteDebug($"{_decoderName}: {ex} -> {ex.Message}"); } }
private void SendCallback(IAsyncResult _asyncResult) { // Retrieve the socket from the state object. var _socket = (Socket)_asyncResult.AsyncState; if (_socket == null) { return; } //Stop timeout timer sendTimeout.Stop(); var _socketError = new SocketError(); var _bytesSent = 0; try { // Complete sending the data to the remote device. _bytesSent = _socket.EndSend(_asyncResult, out _socketError); } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } if (_bytesSent > 0) { Logger.WriteDebug($"{decoderName}: Message with {_bytesSent} bytes sent"); } //EndRecieve returns 0 bytes -> connection have been closed by the remote endpoint. else if (_bytesSent == 0 && decoderStatus == ConnectionStatus.ClientConnected) { Logger.WriteDebug($"{decoderName}: Connection closed from server"); //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Restart(); } else if (_socketError != SocketError.Success) { Logger.WriteDebug($"{decoderName}: SocketError -> {_socketError}"); } }
private void DisconnectCallback(IAsyncResult _asyncResult) { // Retrieve the socket from the state object. var _socket = (Socket)_asyncResult.AsyncState; if (_socket == null) { return; } Logger.WriteDebug($"{decoderName}: Disconnected"); decoderStatus = ConnectionStatus.ClientDisconnected; // Complete the connection. _socket.EndDisconnect(_asyncResult); // Release the socket. decoderSocket.Close(); //Raise event Disconnected.RaiseEvent(this, null); }
/// <summary> /// Try disconnecting from the remote host /// </summary> private void Disconnect() { Logger.WriteDebug($"{decoderName}: disconnect -> start"); //Set status decoderStatus = ConnectionStatus.Disconnecting; //Stop timeouts connectTimeout.Stop(); receiveTimeout.Stop(); sendTimeout.Stop(); try { if (decoderSocket != null && decoderSocket.Connected) { decoderSocket.BeginDisconnect(false, DisconnectCallback, decoderSocket); } else { Logger.WriteDebug($"{decoderName}: disconnect -> ok"); //Set status decoderStatus = ConnectionStatus.Disconnected; //Raise event Disconnected.RaiseEvent(this, null); //Release the socket. decoderSocket.Close(); } } catch (SocketException) { } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }
public void Start() { try { if (!Regex.IsMatch(decoderServer, @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") && !Regex.IsMatch(decoderServer, @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$") ) { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderServer"); Disconnected.RaiseEvent(this, null); return; } if (decoderPort <= 0 || decoderPort >= 65535) { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderPort"); Disconnected.RaiseEvent(this, null); return; } if (string.IsNullOrEmpty(decoderEtxString)) { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderEtxString"); Disconnected.RaiseEvent(this, null); return; } Logger.WriteDebug($"{decoderName}: decoderEtxString -> {decoderEtxString}"); //Timer for auto reconnect reconnectAttempts = 0; reconnectTimer = new Timer { Interval = 1 * 60 * 1000, //1min reconnect AutoReset = false }; reconnectTimer.Elapsed += reconnectTimer_Elapsed; reconnectTimer.Stop(); //Timeout for connect connectTimeout = new Timer { Interval = TIMEOUT_INTERVAL, AutoReset = false }; connectTimeout.Elapsed += connectTimeout_Elapsed; connectTimeout.Stop(); //Timeout for send sendTimeout = new Timer { Interval = TIMEOUT_INTERVAL, AutoReset = false }; sendTimeout.Elapsed += sendTimeout_Elapsed; sendTimeout.Stop(); //Timeout for receive receiveTimeout = new Timer { Interval = 5 * 60 * 1000, //15min no data received AutoReset = false }; receiveTimeout.Elapsed += receiveTimeout_Elapsed; receiveTimeout.Stop(); //Try to connect to TCP/IP-Server Connect(); } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }
private void ReceiveCallback(IAsyncResult _asyncResult) { try { //Stop receive timeout receiveTimeout.Stop(); // Retrieve the state object and the client socket from the asynchronous state object. var _state = (StateObject)_asyncResult.AsyncState; if (_state == null || _state.Socket == null || decoderStatus == ConnectionStatus.Disconnected) { return; } var _socketError = new SocketError(); //Complete recive var _bytesRead = _state.Socket.EndReceive(_asyncResult, out _socketError); if (_bytesRead > 0) { //Store the data received so far _state.Data += decoderEncoding.GetString(_state.Buffer, 0, _bytesRead); //Logger.WriteDebug($"{decoderName}: receive -> {_state.Data}"); //Split each frame var _dataArray = _state.Data.Split(new[] { decoderEtxString }, StringSplitOptions.RemoveEmptyEntries); if (_dataArray != null && _dataArray.Count() > 0) { //Loop through all frames foreach (var _data in _dataArray) { //Raise event MessageReceived.RaiseEvent(this, new MessageEventArgs(_data)); //Clear buffer _state.Data = _state.Data.Replace(_data + decoderEtxString, string.Empty); } } if (_state.Socket != null && _state.Socket.Connected) { //Start receive timeout again receiveTimeout.Start(); //Start receive again _state.Socket.BeginReceive(_state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, _state); } else { //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Reconnect(); } } //EndRecieve returns 0 bytes -> connection have been closed by the remote endpoint. else if (_bytesRead == 0 && decoderStatus == ConnectionStatus.Connected) { Logger.WriteDebug($"{decoderName}: receive -> connection closed from server"); //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Reconnect(); } else if (_socketError != SocketError.Success) { Logger.WriteDebug($"{decoderName}: receive -> SocketError({_socketError})"); //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Reconnect(); } } catch (ObjectDisposedException) { } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }
/// <summary> /// Try connecting to the remote host /// </summary> private void Connect() { Logger.WriteDebug($"{decoderName}: connect -> start"); //Set status decoderStatus = ConnectionStatus.Connecting; //Raise event Connecting.RaiseEvent(this, null); try { //Release decoder if (decoderSocket != null) { decoderSocket.Close(); decoderSocket = null; } //Parse server host/ip Logger.WriteDebug($"{decoderName}: connect -> server({decoderServer})"); if (Regex.IsMatch(decoderServer, @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") ) { // the string is a IP decoderIpAddress = IPAddress.Parse(decoderServer); } else if (Regex.IsMatch(decoderServer, @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$")) { // the string is a host -> try to resolve var _ipHostInfo = Dns.GetHostEntry(decoderServer); foreach (var ipAdress in _ipHostInfo.AddressList) { if (Regex.IsMatch(ipAdress.ToString(), @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") ) { decoderIpAddress = ipAdress; break; } } //If resolve fail -> abort if (decoderIpAddress == null) { Logger.WriteDebug($"{decoderName}: cannot resolve hostname {decoderServer}"); Disconnected.RaiseEvent(this, null); return; } } Logger.WriteDebug($"{decoderName}: connect -> ip({decoderIpAddress})"); //Create a TCP/IP socket var _remoteEP = new IPEndPoint(decoderIpAddress, decoderPort); decoderSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Start timer for timeout connectTimeout.Start(); //Connect to the remote endpoint decoderSocket.BeginConnect(_remoteEP, ConnectCallback, decoderSocket); } catch (SocketException ex) { Logger.WriteDebug($"{decoderName}: connect -> {ex.Message}"); //Start reconnect Reconnect(); } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }
public void Start() { try { if (Regex.IsMatch(decoderServer, @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") ) { // the string is an IP decoderIpAddress = IPAddress.Parse(decoderServer); } else if (Regex.IsMatch(decoderServer, @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$")) { // the string is a host var _ipHostInfo = Dns.GetHostEntry(decoderServer); decoderIpAddress = _ipHostInfo.AddressList[0]; } else { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderServer"); Disconnected.RaiseEvent(this, null); return; } if (decoderPort <= 0 || decoderPort >= 65535) { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderPort"); Disconnected.RaiseEvent(this, null); return; } if (string.IsNullOrEmpty(decoderEtxString)) { Logger.WriteDebug($"{decoderName}: Wrong setting -> decoderEtxString"); Disconnected.RaiseEvent(this, null); return; } //Timer for auto reconnect restartAttempts = 0; restartTimer = new Timer { Interval = 1000, //will be increased in handler AutoReset = false }; restartTimer.Elapsed += reconnectTimer_Elapsed; restartTimer.Stop(); //Timeout for receive sendTimeout = new Timer { Interval = TIMEOUT_INTERVAL, AutoReset = false }; sendTimeout.Elapsed += sendTimeout_Elapsed; sendTimeout.Stop(); //Connect to TCP/IP-Server StartListening(); } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }
public void ReceiveCallback(IAsyncResult _asyncResult) { // Retrieve the state object and the handler socket from the asynchronous state object. var _state = (StateObject)_asyncResult.AsyncState; if (_state == null || decoderSocket == null) { return; } var _socketError = new SocketError(); var _bytesRead = 0; try { // Read data from the remote device. _bytesRead = decoderSocket.EndReceive(_asyncResult, out _socketError); //EndRecieve returns x bytes -> connection ok if (_bytesRead > 0) { //Store the data received so far _state.Data += Encoding.ASCII.GetString(_state.Buffer, 0, _bytesRead); //Split each frame var _dataArray = _state.Data.Split(new[] { decoderEtxString }, StringSplitOptions.RemoveEmptyEntries); if (_dataArray != null && _dataArray.Count() > 0) { //Loop through all frames foreach (var _data in _dataArray) { Logger.WriteDebug($"{decoderName}: Message -> {_data}"); //Remove frame + etx from buffer _state.Data = _state.Data.Replace(_data + decoderEtxString, ""); //Raise event MessageReceived.RaiseEvent(this, new MessageEventArgs(_data)); } } if (decoderSocket != null && decoderSocket.Connected) { //Start receive again decoderSocket.BeginReceive(_state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, _state); } } //EndRecieve returns 0 bytes -> connection have been closed by the remote endpoint. else if (_bytesRead == 0 && decoderStatus == ConnectionStatus.ClientConnected) { Logger.WriteDebug($"{decoderName}: Connection closed from client"); //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Restart(); } else if (_socketError != SocketError.Success) { Logger.WriteDebug($"{decoderName}: SocketError -> {_socketError}"); } } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: Error on receive -> {ex.Message}"); //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Restart(); } }
public void AcceptCallback(IAsyncResult _asyncResult) { //Get the socket that handles the client request. var _listenerSocket = (Socket)_asyncResult.AsyncState; if (_listenerSocket == null) { return; } //Get clientSocket try { decoderSocket = _listenerSocket.EndAccept(_asyncResult); //Shutdown listener only one client allowed listenerSocket.Close(); listenerSocket = null; } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } //Check Connection if (decoderSocket == null || !decoderSocket.Connected) { Logger.WriteDebug($"{decoderName}: Disconnected"); decoderStatus = ConnectionStatus.ClientDisconnected; //Raise event Disconnected.RaiseEvent(this, null); //Try to reconnect again; Restart(); return; } //Start to receive try { Logger.WriteDebug($"{decoderName}: Connection from {decoderSocket.RemoteEndPoint}"); decoderStatus = ConnectionStatus.ClientConnected; restartAttempts = 0; pingAttempts = 0; //Send LoginString Send(loginString); // Begin receiving the data from the remote device. var _state = new StateObject(); decoderSocket.BeginReceive(_state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, _state); //Raise event Connected.RaiseEvent(this, null); } catch (Exception ex) { Logger.WriteDebug($"{decoderName}: {ex} -> {ex.Message}"); } }