Пример #1
0
        /// <summary>
        /// Конструктор класса UDP
        /// </summary>
        /// <param name="servicePort">локальный служебный порт (ПИ)</param>
        /// <param name="debugPort">локальный отладочный порт (ПИ)</param>
        /// <param name="portSendTo">удаленный служебный порт (ПУС)</param>
        public Udp(int servicePort, int debugPort, int portSendTo)
        {
            //--УДАЛИТЬ нужно! Это временная отладка для другого проекта!
            //servicePort = 0; portSendTo = 40100;
            //strIPAddr = "192.168.0.100";
            //-------------------------------------------


            socketService          = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socketDebug            = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _addr                  = IPAddress.Parse(strIPAddr);
            _servicePort           = servicePort;
            _debugPort             = debugPort;
            _portSendTo            = portSendTo;
            state_rx               = STATE_RX.DESCR;
            command_in_servicePort = new UDPCommand();
            command_in_debugPort   = new UDPCommand();
            remotePoint            = new IPEndPoint(_addr, _portSendTo);
            bIsClosed              = false;
            listenTaskDebugPort    = new Task(ListenDebugPort);  //Запускаем прослушивание портов в отдельных потоках
            listenTaskDebugPort.Start();

            listenTaskServicePort = new Task(ListenServicePort);
            listenTaskServicePort.Start();

            token = cancelTokenSource.Token;
        }
Пример #2
0
        /// <summary>
        /// Обработчик прослушивания порта. Поток для приема подключений
        /// </summary>
        /// <param name="port">Порт для прослушивания</param>
        /// <param name="com">В какую команду формируем входящие данные</param>
        void ListenService(int port, UDPCommand com)
        {
            Socket socket = socketService;

            //Привязываем сокет к нужному адресу и порту, который будем прослушивать
            //_addr = IPAddress.Any;
            pointPort = new IPEndPoint(_addr, port);
            socket.Bind(pointPort);

            //Адрес, с которого пришли данные.

            //socket.ReceiveTimeout = 5000;
            byte[] data = new byte[256];


            while (true)
            {
                try
                {
                    int bytes = 0;

                    if (token.IsCancellationRequested)
                    {
                        socket.Close();
                        return;
                    }
                    EndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0);
                    do
                    {
                        bytes = socket.ReceiveFrom(data, ref remoteIP);
                    }while (socket.Available > 0);

                    com.descriptor = data[0];
                    com.data       = new byte[bytes];
                    Array.Copy(data, 1, com.data, 0, bytes);

                    IPEndPoint remoteFullIp = remoteIP as IPEndPoint;   //получаем данные о подключении
                    receivedService?.Invoke(com, remoteFullIp);         //генерируем событие
                }
                catch (Exception ex)
                {
                    if (!bIsClosed)
                    {
                        warningException?.Invoke("SocketService \n\r" + ex.Message);       //генерируем событие о возникшей ошибке
                    }
                }
                finally
                {
                    //Close();
                }
            }
        }
Пример #3
0
        public bool SendCommand(UDPCommand com)
        {
            try
            {
                byte[] buf = new byte[com.data.Length + 1];
                buf[0] = com.descriptor;
                Array.Copy(com.data, 0, buf, 1, com.data.Length);

                socketService.SendTo(buf, remotePoint);        //отправка сообщения на удаленный адрес
                return(true);
            }
            catch
            {
                return(false);
            }
        }
Пример #4
0
        void ListenDebug(int port, UDPCommand com)
        {
            Socket socket = socketDebug;

            //Привязываем сокет к нужному адресу и порту, который будем прослушивать
            pointPort = new IPEndPoint(_addr, port);
            socket.Bind(pointPort);

            //Адрес, с которого пришли данные.

            //socket.ReceiveTimeout = 5000;
            byte[] data = new byte[256];


            while (true)
            {
                try
                {
                    int bytes = 0;

                    if (token.IsCancellationRequested)
                    {
                        socket.Close();
                        return;
                    }
                    EndPoint remoteIP = new IPEndPoint(IPAddress.Any, 0);
                    do
                    {
                        bytes = socket.ReceiveFrom(data, ref remoteIP);
                    }while (socket.Available > 0);

                    com.descriptor = data[0];
                    com.data       = new byte[bytes];
                    Array.Copy(data, 1, com.data, 0, bytes);

                    IPEndPoint remoteFullIp = remoteIP as IPEndPoint;   //получаем данные о подключении
                    receivedDebug?.Invoke(com, remoteFullIp);           //генерируем событие

                    /*if (socket.Available > 0)
                     * {
                     *  byte[] tmp = new byte[socket.Available];
                     *  bytes = socket.ReceiveFrom(tmp, ref remoteIP);
                     *  foreach (byte b in tmp) rx_queue.Enqueue(b);
                     * }
                     * if (state_rx == STATE_RX.DESCR)
                     * {
                     *  if (rx_queue.Count >= 1)
                     *  {
                     *      com.descriptor = rx_queue.Dequeue();
                     *      state_rx = STATE_RX.DATA;
                     *  }
                     * }
                     * if (state_rx == STATE_RX.DATA)
                     * {
                     *  if (rx_queue.Count >= 1)
                     *  {
                     *      com.data = new byte[rx_queue.Count];
                     *      for (int i = 0; i < com.data.Length; i++)
                     *          com.data[i] = rx_queue.Dequeue();
                     *
                     *      state_rx = STATE_RX.DESCR;
                     *      rx_queue.Clear();
                     *
                     *      IPEndPoint remoteFullIp = remoteIP as IPEndPoint;   //получаем данные о подключении
                     *      received?.Invoke(com, remoteFullIp);                //генерируем событие
                     *  }
                     * }*/
                }
                catch (Exception ex)
                {
                    warningException?.Invoke("SocketDebug \n\r" + ex.Message);       //генерируем событие о возникшей ошибке
                }
                finally
                {
                    //Close();
                }
            }
        }