예제 #1
0
파일: SocketClient.cs 프로젝트: OlehKuz/api
        public SocketClient(string host, int port, MessageManager messageManager, TcpReceiver tcpReceiver)
        {
            _host = host;
            _port = port;

            _sendingMessagesQueue = new Queue <SocketMessage>();
            _tcpReceiver          = tcpReceiver;
            _messageManager       = messageManager;
            StartTcpSendingThread();
            Thread.Sleep(20000);
            StartTcpReceivingThread();
        }
        internal virtual void Disconnect()
        {
            if (Disposed)
            {
                return;
            }
            if (ioc != null)
            {
                ioc.RemoveChannel(this);
            }
            lock (ConnectionLock)
            {
                if (Status != ChannelStatus.CONNECTED)
                {
                    return;
                }
                Status          = ChannelStatus.DISCONNECTED;
                StartSearchTime = DateTime.Now;
                ioc             = null;
                SID             = 0;

                if (PrivMonitorChanged != null)
                {
                    AfterConnect(action =>
                    {
                        if (MonitoredType == null)
                        {
                            return;
                        }
                        DataPacket p = DataPacket.Create(16 + 16);
                        p.Command    = (ushort)CommandID.CA_PROTO_EVENT_ADD;
                        p.DataType   = (ushort)TypeHandling.Lookup[MonitoredType];
                        p.DataCount  = ChannelDataCount;
                        p.Parameter1 = SID;
                        p.Parameter2 = CID;

                        p.SetUInt16(12 + 16, (ushort)MonitorMask);

                        if (ioc != null)
                        {
                            ioc.Send(p);
                        }
                        else
                        {
                            Disconnect();
                        }
                    });
                }
            }
        }
예제 #3
0
        public MainWindow()
        {
            InitializeComponent();

            if (Properties.Settings.Default.Name.CompareTo("") == 0)
            {
                // first application run
                UserSettings us = new UserSettings();
                us.ShowDialog(); //ShowDialog returns only when the window is closed
            }

            DataContext = this;

            SendingTransferList = new ObservableCollection <FileTransfer>();
            // sorting sending fileTransfers
            ICollectionView sendingTransferListView = CollectionViewSource.GetDefaultView(SendingTransferList);

            sendingTransferListView.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending));
            sendingTransferListView.SortDescriptions.Add(new SortDescription("ManagementDateTime", ListSortDirection.Ascending));

            TCPSender.NewTransferEvent += AddNewTransfer;

            // udp socket listening for request
            UdpListener = new UdpListener();

            // launching background thread
            Thread udpListenerThread = new Thread(UdpListener.Listen);

            udpListenerThread.IsBackground = true;
            udpListenerThread.Start();

            ReceivingTransferList = new ObservableCollection <FileTransfer>();
            // sorting receiving fileTransfers
            ICollectionView receivingTransferListView = CollectionViewSource.GetDefaultView(ReceivingTransferList);

            receivingTransferListView.SortDescriptions.Add(new SortDescription("Status", ListSortDirection.Ascending));
            receivingTransferListView.SortDescriptions.Add(new SortDescription("ManagementDateTime", ListSortDirection.Ascending));

            // tcp socket listening for file transfer
            TcpReceiver tcpReceiver = new TcpReceiver(Constants.TRANSFER_TCP_PORT);

            TcpReceiver.NewTransferEvent += AddNewTransfer;

            // launching background thread
            Thread tcpReceiverThread = new Thread(tcpReceiver.Receive);

            tcpReceiverThread.SetApartmentState(ApartmentState.STA);
            tcpReceiverThread.IsBackground = true;
            tcpReceiverThread.Start();

            // retrieving old sending file transfers
            if (Properties.Settings.Default.SendingTransferFiles != "")
            {
                string transfers = Properties.Settings.Default.SendingTransferFiles;

                foreach (var fileTransfer in JsonConvert.DeserializeObject <ObservableCollection <FileTransfer> >(transfers))
                {
                    if (fileTransfer.Status == TransferStatus.Pending)
                    {
                        fileTransfer.Status = TransferStatus.Error;
                    }

                    SendingTransferList.Add(fileTransfer);
                }
            }

            // retrieving old receiving file transfers
            if (Properties.Settings.Default.ReceivingTransferFiles != "")
            {
                string transfers = Properties.Settings.Default.ReceivingTransferFiles;

                foreach (var fileTransfer in JsonConvert.DeserializeObject <ObservableCollection <FileTransfer> >(transfers))
                {
                    if (fileTransfer.Status == TransferStatus.Pending)
                    {
                        fileTransfer.Status = TransferStatus.Error;
                    }

                    ReceivingTransferList.Add(fileTransfer);
                }
            }
        }
        internal void SetIoc(DataPipe pipe)
        {
            TcpReceiver tcpReceiver = (TcpReceiver)pipe[0];

            tcpReceiver.AddChannel(this);
            lock (ConnectionLock)
            {
                if (!Client.Searcher.Contains(this))
                {
                    return;
                }
                Client.Searcher.Remove(this);
                SID = 0;

                ioc = tcpReceiver;
                lock (ioc.ChannelSID)
                {
                    //Console.WriteLine(ioc.ChannelSID.Count);
                    // Channel already known
                    if (ioc.ChannelSID.ContainsKey(ChannelName))
                    {
                        SID = ioc.ChannelSID[ChannelName];
                        //Console.WriteLine("Here");
                        EpicsChannel chan = ioc.ConnectedChannels.FirstOrDefault(row => row.ChannelName == ChannelName && row.ChannelDataCount != 0);
                        if (chan != null)
                        {
                            this.ChannelDataCount   = chan.ChannelDataCount;
                            this.channelDefinedType = chan.channelDefinedType;
                            this.ChannelDataCount   = chan.ChannelDataCount;
                            this.channelDefinedType = chan.ChannelDefinedType;
                            Status = ChannelStatus.CONNECTED;
                            ConnectionEvent.Set();
                        }
                    }
                }
            }
            if (SID != 0)
            {
                //Console.WriteLine("SID " + SID + " STATUS CHANGED");
                if (StatusChanged != null)
                {
                    StatusChanged(this, Status);
                }
                return;
            }
            if (Client.Configuration.DebugTiming)
            {
                lock (ElapsedTimings)
                {
                    if (!ElapsedTimings.ContainsKey("IocConnection"))
                    {
                        ElapsedTimings.Add("IocConnection", Stopwatch.Elapsed);
                    }
                }
            }

            // We need to create the channel
            int padding;

            if (ChannelName.Length % 8 == 0)
            {
                padding = 8;
            }
            else
            {
                padding = (8 - (ChannelName.Length % 8));
            }

            DataPacket packet = DataPacket.Create(16 + ChannelName.Length + padding);

            packet.Command    = (ushort)CommandID.CA_PROTO_CREATE_CHAN;
            packet.DataType   = 0;
            packet.DataCount  = 0;
            packet.Parameter1 = cid;
            packet.Parameter2 = (uint)EpicsConstants.CA_MINOR_PROTOCOL_REVISION;
            packet.SetDataAsString(ChannelName);

            if (ioc != null)
            {
                ioc.Send(packet);
            }
            else
            {
                Disconnect();
                return;
            }
            lock (ElapsedTimings)
            {
                if (!ElapsedTimings.ContainsKey("SendCreateChannel"))
                {
                    ElapsedTimings.Add("SendCreateChannel", Stopwatch.Elapsed);
                }
            }
        }