Beispiel #1
0
        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);
        }
Beispiel #4
0
        /// <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}");
            }
        }
Beispiel #5
0
        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}");
            }
        }
Beispiel #6
0
        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}");
            }
        }
Beispiel #7
0
        /// <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}");
            }
        }