/// <summary> /// Disconnect and stop cilent /// </summary> internal void StopExchange() { IsStarted = false; _isReadThreadEnabled = false; //lock (_networkInterfaceReadSyncObject) { //lock (_networkInterfaceWriteSyncObject) { _networkInterface?.Dispose(); _networkInterface = null; } } }
/// <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; }
private void DisconnectFromServer() { StopExchange(); _exchangeInterface?.Dispose(); _exchangeInterface = null; if (IsConnected) { IsConnected = false; OnDisconnectedEvent(); } }
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); } }
//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); }
public void Start(INetworkExchangeInterface networkInterface) { StartExchange(networkInterface); }