2015-11-11 35 views
0

我在接收给定的udp数据包时遇到了问题。为什么不收到udp数据包? (可以在Wireshark中看到)

有问题的代码如下:

//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

回答

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

这样会令防火墙烦恼,但它似乎工作。

相关问题