示例#1
0
        private void ConnectCallback(IAsyncResult _asyncResult)
        {
            Logger.WriteDebug($"{decoderName}: connect -> callback");

            //Retrieve the socket from the state object.
            var _socket = (Socket)_asyncResult.AsyncState;

            if (_socket == null)
            {
                return;
            }

            try
            {
                //Stop timeouts
                connectTimeout.Stop();
                receiveTimeout.Stop();
                sendTimeout.Stop();
                //Complete the connection.
                _socket.EndConnect(_asyncResult);
            }
            catch (Exception ex)
            {
                Logger.WriteDebug($"{decoderName}: connect -> {ex.Message}");
            }

            //Check Connection
            if (_socket == null || !_socket.Connected)
            {
                Logger.WriteDebug($"{decoderName}: connect -> fail");
                //Set status
                decoderStatus = ConnectionStatus.Disconnected;
                //Raise event
                Disconnected.RaiseEvent(this, null);
                //Try to reconnect again;
                Reconnect();
            }
            else
            {
                Logger.WriteDebug($"{decoderName}: connect -> ok ({_socket.RemoteEndPoint})");
                //Set status
                decoderStatus = ConnectionStatus.Connected;
                //Raise event
                Connected.RaiseEvent(this, null);
                //Reset variables
                reconnectAttempts = 0;
                pingCount         = 0;
                //Send LoginString
                Send(loginString);

                //Start receive timeout
                receiveTimeout.Start();
                //Begin receiving the data from the remote device.
                var _state = new StateObject();
                _state.Socket = _socket;
                _socket.BeginReceive(_state.Buffer, 0, StateObject.BufferSize, 0, ReceiveCallback, _state);
            }
        }
示例#2
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}");
            }
        }
        public void Connect()
        {
            _clientSocket.Connect(_hostEndPoint);
            Connected.RaiseEvent(this, EventArgs.Empty);

            SocketAsyncEventArgs readEventArgs = new SocketAsyncEventArgs();

            readEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            readEventArgs.SetBuffer(new byte[_bufferSize], 0, _bufferSize);

            // As soon as the client is connected, post a receive to the connection
            bool willRaiseEvent = _clientSocket.ReceiveAsync(readEventArgs);

            if (!willRaiseEvent)
            {
                ProcessReceive(readEventArgs);
            }
        }
        public void Connect()
        {
            if (_disposed)
            {
                throw new ObjectDisposedException($"Can't connect because SocketClient is disposed.");
            }

            _clientSocket.Connect(_hostEndPoint);
            Connected.RaiseEvent(this, EventArgs.Empty);

            _readEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            _readEventArgs.SetBuffer(new byte[_bufferSize], 0, _bufferSize);

            // As soon as the client is connected, post a receive to the connection
            bool willRaiseEvent = _clientSocket.ReceiveAsync(_readEventArgs);

            if (!willRaiseEvent)
            {
                ProcessReceive(_readEventArgs);
            }
        }
        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}");
            }
        }