为什么不收到udp包? (可以在Wireshark中看到)

时间:2015-11-11 12:47:32

标签: c# udp

我在C#程序中收到给定的udp数据包时遇到问题。

有问题的代码如下:

//create transport
m_conn = new UdpClient(new IPEndPoint(m_interface_ip, 0));
m_conn.DontFragment = true;
m_conn.EnableBroadcast = true;
m_conn.Connect(new IPEndPoint(IPAddress.Parse(destination_ip), m_port));
m_conn.BeginReceive(new AsyncCallback(OnDataReceived), m_conn);

//create packet
//...

//send
m_conn.Send(buffer, length);

OnDataReceived函数只是一个带断点的空函数。

我已将防火墙和程序禁用为“允许列表”。

可以在Wireshark中看到“请求”和“响应”。请参阅附件pcap文件。数据包似乎有效。该设备是经过认证的Profinet设备(如果它有所不同)。

然而我似乎无法将'响应'吸收到OnDataReceived函数中。

我错过了一些基本的东西吗?是否有一些与udp / ip标头不同的东西?

Attached Wireshark output

1 个答案:

答案 0 :(得分:0)

我找到了答案。似乎设备正在响应来自不同源端口的请求。这意味着Windows驱动程序(和Wireshark)将消息标记为不相关。 (没有响应来自相同的套接字/端口是一个相当愚蠢的事情,我猜这是一个错误。)

然而,它可以修复。而不是上面的“单播”套接字,必须创建一个服务器套接字。像这样:

//create transport
IPEndPoint local = new IPEndPoint(m_interface_ip, 0); //bind to any free port
m_conn = new UdpClient();
m_conn.Client.Bind(local);
m_conn.EnableBroadcast = true;
m_conn.BeginReceive(new AsyncCallback(OnDataReceived), m_conn);

//create packet...
//...

//send
m_conn.Send(buffer, length, new IPEndPoint(m_destination_ip, m_port));

这会惹恼防火墙,但似乎有效。