Не удается получить приём как широковещательных UDP пакетов, так и по IP адресам. Устройство которое посылает пакеты (микроконтроллер) не поддерживает динамическое распределение адресов, только ARP. Единственное, что может делать программа отправлять широковещательные пакеты. При этом все начинается работать, если паралельно запустить Wireshark, аналогично ведет себя пример кода для SharpPcap, а также програмка Socket Test
sourceforge.net/projects/sockettest
Использую .Net Framework 4.62. Firewall и антивирусы отключил. В программе (в файле манифеста) требую права администратора, но это не помогает. Устанавливал также статический адрес с помощью команды arp -s, но и это не помогло.
Думаю, что это настройки сети у Windows, которые Wireshark умеет изменять. Возможно Windows их получает с сервера и помнит когда отключен от сети и подсоеденен к устройству. Компьютер настроен на работу в сети предприятия, входит в рабочую группу. С сетевыми вопросами я пока не сталкивался, и в этом не разбираюсь. Подскажите куда копать?
Привожу код C#, но он похоже работает:
public void UdpConnect() {
udpSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpListener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpListener.Bind(new IPEndPoint(IPAddress.Any, 60001));
// MCU send data to dstIP = PC_IP and dstPort = 60001
}
int Send() {
byte[] dgram = tx_buf.ToArray();
int n = udpSender.SendTo(dgram, SocketFlags.DontRoute, new IPEndPoint(IPAddress.Parse("192.168.0.200"), 60000));
// PC send data to MCU IP 192.168.0.200 and dstPort = 60000
Debug.WriteLine("Send " + n + " bytes");
return n;
}
byte[] Receive(int timeout_ms = 3000) {
byte[] data = new byte[1518];
int byteCount = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
do {
if (udpListener.Available != 0) {
Debug.WriteLine("Available: " + udpListener.Available);
byteCount = udpListener.Receive(data, data.Length, SocketFlags.None);
Debug.WriteLine("Received UDP packet length: " + byteCount);
}
else
Thread.Sleep(100);
} while (byteCount == 0 && sw.ElapsedMilliseconds < timeout_ms);
return byteCount == 0 ? null : data.Take(byteCount).ToArray();
}
byte[] SendReceive(int timeout_ms = 3000, int attempts = 3) {
byte[] result = null;
for (int i = 0; i < attempts; i++) {
Send();
result = Receive(timeout_ms);
if (result != null)
break;
else
Debug.WriteLine("Attempt " + (i + 1) + " failed");
}
if (result == null) {
Debug.WriteLine("UDP receiver timeout");
throw new TimeoutException();
}
return result;
}