private void FinalizeConnection(Retranslator retranslator) { _connectedClients.Add(new ClientInfo { Address = retranslator.Address, Port = retranslator.Port }); Task.Run(() => StartListenForNewComponents(retranslator)); }
private void CloseRetranslator(Retranslator retranslator) { retranslator.ReceiveClient.Close(); retranslator.SendClient.Close(); lock (_locker) { _retranslators.Remove(retranslator); _disconnectedClients.Add(new ClientInfo { Address = retranslator.Address, Port = retranslator.Port }); } }
private void StartListenForNewComponents(Retranslator retranslator) { TcpClient receiveClient = retranslator.ReceiveClient; NetworkStream stream = receiveClient.GetStream(); try { while (IsRunning) { ReceiveEvents(stream); ReceiveComponents(stream); } } finally { CloseRetranslator(retranslator); } }
private void AcceptNewClient(TcpClient receiveClient) { NetworkStream receiveStream = receiveClient.GetStream(); int addressLength = receiveStream.ReadByte(); string address = receiveStream.ReadAsciiString(addressLength); short port = receiveStream.ReadShort(); Retranslator existingRetranslator = GetRetranslatorIfExistOrNull(address, port); if (existingRetranslator != null) { existingRetranslator.ReceiveClient = receiveClient; FinalizeConnection(existingRetranslator); return; } TcpClient sendClient = new TcpClient(address, port); NetworkStream sendStream = sendClient.GetStream(); sendStream.WriteByte((byte)_config.LocalAddress.Length); sendStream.WriteAsciiString(_config.LocalAddress); sendStream.WriteShort(_config.LocalPort); var newRetranslator = new Retranslator { Address = address, Port = port, ReceiveClient = receiveClient, SendClient = sendClient }; lock (_locker) { _retranslators.Add(newRetranslator); FinalizeConnection(newRetranslator); } }