UDP-клиент прекращает прием данных, пока Wireshark все еще их видит

У меня Atmega с чипом wiznet, отправляющим UDP-сообщения через маршрутизатор linksys, подключенный к моему ПК. На ПК запущен код, который открывает и прослушивает связь по UDP-порту 1989 года. У меня также есть Wireshark на ПК.

Wireshark будет продолжать показывать, что сообщения принимаются от микроконтроллера, но udpclient в моем приложении не может получить эти сообщения через некоторое время. Примерно через 40 секунд или 80 сообщений сообщение будет получено приложением, а затем приложение прекращает прием

Если я отправлю данные из приложения, сообщения будут получены еще раз в течение того же времени.

Я не вижу никаких исключений, и при этом UDPclient не закрывается. похоже, что он возвращается к функции m_UDPClient.Receive и ждет.

Код ниже

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net.Sockets;
using System.Net;

namespace SecurityServiceLibrary
{
    public class SecurityService
    {
        private UdpClient m_UDPClient;

        public Action<String> DiagnosticMessageFunction;

        private IPEndPoint m_Nodes = new IPEndPoint(IPAddress.Broadcast, 1989);
        private IPAddress m_LocalIPAddress;

        private Task m_Listener;

        public SecurityService(IPAddress LocalIPAddress)
        {
            m_LocalIPAddress = LocalIPAddress;

            m_UDPClient = new UdpClient(new IPEndPoint(m_LocalIPAddress, 1989));
            m_UDPClient.EnableBroadcast = true;

            m_Listener = new Task(Listen);
            m_Listener.Start();
        }
        private async void Listen()
        {
            DiagnosticMessage("Start Listening");
            while (true)
            {
                IPEndPoint Sender = new IPEndPoint(0,0);
                List<byte> byMessage = m_UDPClient.Receive(ref Sender).ToList();
                if (!Sender.Address.Equals(m_LocalIPAddress))
                {
                    ParseMessage(byMessage);
                    DiagnosticMessage(Sender.Address.ToString() + " Message: " + BitConverter.ToString(byMessage.ToArray()));
                }
            }
        }
        private void ParseMessage(List<Byte> byMessage)
        {
            if (byMessage.Count >= 7)
            {
                List<Byte> MAC_Address = byMessage.GetRange(0, 6);
                Byte MessageID = byMessage[6];

                switch (MessageID)
                {
                    case 0x01:

                        break;

                    case 0x02:

                        break;
                }
            }
        }

        public void RequestAllStatus()
        {
            byte[] Message = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81 };
            m_UDPClient.Send(Message, Message.Length,m_Nodes);
        }


        private void DiagnosticMessage(String Message)
        {
            DiagnosticMessageFunction?.Invoke(Message);
        }
    }
}

Код формы

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;

using SecurityServiceLibrary;


namespace SecurityServiceGUI
{
    public partial class Form1 : Form
    {
        SecurityService m_securityService = new SecurityService(IPAddress.Parse("192.168.1.10"));

        public Form1()
        {
            InitializeComponent();
            m_securityService.DiagnosticMessageFunction = AddToDiagnosticMessage;
        }

        private void AddToDiagnosticMessage(String Message)
        {
            AddToListBox(listBox_Diagnostic, DateTime.Now.ToString() +": "+ Message);
        }

        private void AddToListBox(ListBox listBox, String Message)
        {
            if (listBox.InvokeRequired)
            {
                this.Invoke(new Action<ListBox,String>(AddToListBox), new object[] { listBox, Message });
            }
            else
            {
                if(listBox.Items.Count > 20)
                {
                    listBox.Items.RemoveAt(0);
                }
                listBox.Items.Add(Message);
            }
        }

        private void button_RequestAllStatus_Click(object sender, EventArgs e)
        {
            m_securityService.RequestAllStatus();
        }
    }
}

0 ответов

Другие вопросы по тегам