Пример #1
0
        public void udp_receiver()
        {
            xbs_messages.addInfoMessage(" * udp receiver thread started", xbs_message_sender.UDP_LISTENER);
            byte[]          data            = new byte[2048];
            IPEndPoint      remote_endpoint = new IPEndPoint(IPAddress.Any, 0);
            EndPoint        ep             = (EndPoint)remote_endpoint;
            int             bytes_received = 0;
            xbs_udp_message msg            = null;

#if !DEBUG
            try
            {
#endif
            while (!exiting)
            {
                try
                {
                    bytes_received = udp_socket.ReceiveFrom(data, ref ep);
                }
                catch (SocketException)
                {
                    bytes_received = 0;
                }
                if (!exiting && bytes_received > 0)
                {
                    xbs_node_message_type command = xbs_node_message.getMessageTypeFromUDPPacket(data);
                    msg          = new xbs_udp_message();
                    msg.msg_type = command;
                    if (bytes_received > 3)
                    {
                        msg.data_len = xbs_node_message.getDataLengthFromUDPPacket(data);
                        if (msg.data_len + sizeof(UInt16) + sizeof(xbs_node_message_type) == bytes_received)
                        {
                            msg.data = new byte[msg.data_len];
                            Buffer.BlockCopy(data, xbs_udp_message.HEADER_LENGTH, msg.data, 0, msg.data_len);
                        }
                        else
                        {
#if DEBUG
                            xbs_messages.addInfoMessage("received packet with wrong length! expected " + msg.data_len + " but got " + (bytes_received - sizeof(UInt16) - sizeof(xbs_node_message_type)) + " bytes.", xbs_message_sender.UDP_LISTENER, xbs_message_type.ERROR);
#endif
                            msg = null;
                        }
                    }
                    else
                    {
                        msg.data_len = 0;
                    }

                    if (msg != null)
                    {
                        remote_endpoint = (IPEndPoint)ep;
                        msg.src_ip      = remote_endpoint.Address;
                        msg.src_port    = remote_endpoint.Port;
                        lock (_locker)
                        {
                            if (command == xbs_node_message_type.DATA)
                            {
                                lock (in_msgs_high_prio)
                                    in_msgs_high_prio.Enqueue(msg);
                            }
                            else
                            {
                                lock (in_msgs)
                                    in_msgs.Enqueue(msg);
                            }
                            Monitor.PulseAll(_locker);
                        }
                    }
                }
            }
#if !DEBUG
        }

        catch (Exception ex)
        {
            ExceptionMessage.ShowExceptionDialog("udp_receiver service", ex);
        }
#endif
#if DEBUG
            xbs_messages.addDebugMessage(" * udp receiver thread stopped", xbs_message_sender.UDP_LISTENER);
#endif
        }