WinForm C#程序无法捕获传入的UDP数据包

时间:2018-06-19 20:04:21

标签: c# sockets udp ethernet xmos

我有简单的MCU网络,该网络仅支持ARP,广播和单播UDP / IP协议,并且我直接连接到MCU,而没有PC网络(点对点)。

在C#中,我有两个UDP套接字-发送者和监听者。侦听器绑定到端点(侦听端口60001)。

但是我的程序只有在运行Wireshark时才能工作。没有Wireshark,它只能发送广播数据包,而不能接收。

MCU实现ARP协议(我也在Windows中尝试过静态IP。命令arp -s)。我尝试关闭Windows 10防火墙和防病毒软件,以管理员身份运行程序,什么也没有。仅当我运行Wireshark时,我的C#程序才会接收数据包。

IP标头校验和正确-我在Wireshark中启用了检查。 udp校验和= 0(PC也不计算校验和)

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

1 个答案:

答案 0 :(得分:0)

问题出在短ARP和UDP数据包中。当我将设备连接到局域网时,我就明白了(通常,以太网控制器会自动添加填充,而不是XMOS)。

以太网数据包的最小大小为64字节(标头+数据+ crc32)。我发送的ARP不带填充,也发送了短广播UDP。

但是我在捕获GOOSE数据包和SharpPcap库时遇到问题 How I can grant permission for Pcap library in Windows 10 from C#?