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();
}
}
}