コード例 #1
0
 /// <summary>
 /// Disconnect and stop cilent
 /// </summary>
 internal void StopExchange()
 {
     IsStarted            = false;
     _isReadThreadEnabled = false;
     //lock (_networkInterfaceReadSyncObject)
     {
         //lock (_networkInterfaceWriteSyncObject)
         {
             _networkInterface?.Dispose();
             _networkInterface = null;
         }
     }
 }
コード例 #2
0
        /// <summary>
        /// Start
        /// </summary>
        /// <param name="networkInterface">interface to send and receive data</param>
        /// <param name="startReadThread"> specify is read thread should be enabled</param>
        internal void StartExchange(INetworkExchangeInterface networkInterface, bool startReadThread)
        {
            lock (_networkInterfaceReadSyncObject)
            {
                lock (_networkInterfaceWriteSyncObject)
                {
                    _networkInterface = networkInterface;
                }
            }

            _isReadThreadEnabled = startReadThread;
            IsStarted            = true;
        }
コード例 #3
0
        private void DisconnectFromServer()
        {
            StopExchange();

            _exchangeInterface?.Dispose();
            _exchangeInterface = null;

            if (IsConnected)
            {
                IsConnected = false;
                OnDisconnectedEvent();
            }
        }
コード例 #4
0
        private bool ConnectToServer()
        {
            System.Net.Sockets.TcpClient client = null;
            try
            {
                _exchangeInterface?.Dispose();
                client = new System.Net.Sockets.TcpClient(DestinationIpEndPoint.Address.ToString(), DestinationIpEndPoint.Port);
                if (IsEncrypted)
                {
                    _exchangeInterface = new EncryptedTcpClientNetworkExchangeInterface(client, _serverName, _clientCertificates, _enabledSslProtocols, _checkCertificateRevocation, _encryptionPolicy, ValidateServerCertificateEvent, SelectLocalCertificateEvent);
                }
                else
                {
                    _exchangeInterface = new TcpClientNetworkExchangeInterface(client);
                }
                _exchangeInterface.DisconnectedEvent += _exchangeInterface_DisconnectedEvent;

                IsConnected    = true;
                _pingFailCount = 0;

                StartExchange(_exchangeInterface);

                OnConnectedEvent(_exchangeInterface.LocalEndPoint, _exchangeInterface.RemoteEndPoint);

                return(true);
            }
            catch (SocketException se)
            {
                _exchangeInterface?.Dispose();
                client?.Close();
                OnConnectionFailEvent(se.SocketErrorCode.ToString());
                return(false);
            }
            catch (ThreadAbortException)
            {
                return(false);
            }
            catch (Exception ex)
            {
                _exchangeInterface?.Dispose();
                client?.Close();
                OnConnectionFailEvent(ex.Message);
                return(false);
            }
        }
コード例 #5
0
        //private void ProcessDataThreadFunc()
        //{
        //    while (true)
        //    {
        //        try
        //        {
        //            if (IsStarted)
        //            {
        //                if (_hasDataToProcessWh != null && _hasDataToProcessWh.WaitOne(Timeout.Infinite))
        //                {
        //                    byte dataByte;
        //                    if (_processDataQueue.TryDequeue(out dataByte))
        //                    {
        //                        ProcessByteInternal(dataByte);
        //                    }
        //                    lock (_hasDataToProcessWhLockObject)
        //                    {
        //                        if (_processDataQueue.IsEmpty) _hasDataToProcessWh?.Reset();
        //                        else _hasDataToProcessWh?.Set();
        //                    }
        //                }
        //            }
        //            else Thread.Sleep(1);
        //        }
        //        catch (ThreadAbortException)
        //        {
        //            break;
        //        }
        //        catch (Exception ex)
        //        {
        //            OnErrorEvent(ex);
        //            lock (_hasDataToProcessWhLockObject)
        //            {
        //                if (_processDataQueue.IsEmpty) _hasDataToProcessWh?.Reset();
        //                else _hasDataToProcessWh?.Set();
        //            }
        //        }
        //    }
        //}

        //private void WriteDataThreadFunc()
        //{
        //    while (true)
        //    {
        //        try
        //        {
        //            if (IsStarted && _networkInterface != null && _networkInterface.IsConnected)
        //            {
        //                if (_hasDataToSendWh != null && _hasDataToSendWh.WaitOne(Timeout.Infinite))
        //                {

        //                    byte[] data;
        //                    if (_sendDataQueue.TryDequeue(out data))
        //                    {
        //                        var written = _networkInterface.Write(data);
        //                        if (written != data.Length)
        //                        {
        //                            throw new NetworkWriteException($"{InstanceName}.SendDataSync: Send error. bytes to send " +
        //                                                                   data.Length + " but sent " +
        //                                                                   written + " bytes ");
        //                        }
        //                        //OnDataSentEvent(new NetworkDataEventArgs(data, _networkInterface.RemoteEndpoint));
        //                    }
        //                    lock (_hasDataToSendLockWhObject)
        //                    {
        //                        if (_sendDataQueue.IsEmpty) _hasDataToSendWh?.Reset();
        //                        else _hasDataToSendWh?.Set();
        //                    }
        //                }
        //            }
        //            else Thread.Sleep(1);
        //        }
        //        catch (ThreadAbortException)
        //        {
        //            break;
        //        }
        //        catch (Exception ex)
        //        {
        //            OnErrorEvent(ex);
        //            lock (_hasDataToSendLockWhObject)
        //            {
        //                if (_sendDataQueue.IsEmpty) _hasDataToSendWh?.Reset();
        //                else _hasDataToSendWh?.Set();
        //            }
        //        }
        //    }
        //}

        #endregion

        #region Methods

        /// <summary>
        /// Start
        /// </summary>
        /// <param name="networkInterface">interface to send and receive data</param>
        internal void StartExchange(INetworkExchangeInterface networkInterface)
        {
            StartExchange(networkInterface, true);
        }
コード例 #6
0
 public void Start(INetworkExchangeInterface networkInterface)
 {
     StartExchange(networkInterface);
 }