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 }