我在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标头不同的东西?
答案 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));
这会惹恼防火墙,但似乎有效。