为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
函数式编程 2021-08-22 15:08:33
我有一个简单的 MCU 网络,它只支持 ARP、广播和单播 UDP/IP 协议,我直接连接到 MCU,没有 PC 网络(点对点)。在 C# 中,我有两个 UDP 套接字 - 发送方和侦听器。侦听器绑定到端点(侦听端口 60001)。但是我的程序只有在运行 Wireshark 时才能运行。如果没有 Wireshark,它只能发送广播数据包,但不能接收。MCU 实现 ARP 协议(我也在 Windows 中尝试过静态 IP。命令 arp -s)。我尝试关闭 Windows 10 防火墙和防病毒软件,以管理员身份运行程序,什么也没有。仅当我运行 Wireshark 时,我的 C# 程序才会接收数据包。IP 标头校验和是正确的 - 我在 Wireshark 中启用了检查。udp checksum = 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");    }
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

问题在于简短的 ARP 和 UDP 数据包。当我将设备连接到本地网络时,我理解了这一点(通常以太网控制器自动添加填充,但不是 XMOS)。

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


查看完整回答
反对 回复 2021-08-22
  • 1 回答
  • 0 关注
  • 276 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信