Задать вопрос
Papayaved
@Papayaved
FPGA, MCU

Как разрешить приём данных по UDP в Windows из C#?

Не удается получить приём как широковещательных 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;
}
  • Вопрос задан
  • 605 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Papayaved
@Papayaved Автор вопроса
FPGA, MCU
Проблема оказалась со стороны микроконтроллера, я посылал короткие ARP и UDP пакеты. Минимальный размер Ethernet пакета 64 байта и надо добавлять в конце 0
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Вы смотрели вот это: www.jarloo.com/c-udp-multicasting-tutorial ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы