我有一个简单的UDP侦听器,我正在尝试从中收集数据报。我的数据报可以是两种数据格式之一。使用第一种数据格式,我按预期在程序中接收数据。对于第二个,尽管我可以通过Wireshark验证UDP数据是否传递到网络接口,但绝对没有迹象表明我的程序已收到数据。我认为也许这些是Windows拒绝的格式错误的UDP数据包,但Wireshark确实将它们标记为UDP。我的代码如下:
static void Main(string[] args)
{
Thread thdUdpServer = new Thread(new ThreadStart(serverThread));
thdUdpServer.Start();
}
static void serverThread()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(new IPAddress(0), 2000));
while (true)
{
byte[] responseData = new byte[128];
socket.Receive(responseData);
string returnData = Encoding.ASCII.GetString(responseData);
Console.WriteLine(DateTime.Now + " " + returnData);
}
丢失的数据包都是29字节的数据报,看起来像这样(翻译成ASCII)。
#01RdFFFF...?...... ........F
为什么Wireshark会表明他们的存在,但.NET似乎没有看到他们?
答案 0 :(得分:2)
如果字节包含不可打印的ASCII字符,您可能无法在控制台上看到它们。
答案 1 :(得分:0)
您的代码中缺少某些内容。调用ReceiveFrom时应该抛出一个套接字异常(至少根据MSDN,没有尝试过你的代码。)
您应该将套接字绑定到要监听的地址:端口(或使用0.0.0.0作为侦听任何本地地址的地址):
socket.Bind(new IPEndPoint(new IPAddress(0), 2000);
ReceiveFrom中的EndPoint不是服务器的侦听端口。它是您要从中接收数据包的地址。您可以使用端点0.0.0.0:0从任何主机接收。
从方法返回后,Endpoint将填充发送数据包(客户端)的主机的地址。
如果您不关心客户端端点,则可以使用Receive而不是ReceiveFrom。 可能你的客户端没有从192.168.1.100:2000发送数据包,这就是你没有收到它们的原因;想到为什么在调用ReceiveFrom时我没有得到例外。
此外: 无需在:
中调用Convert.ToInt32new IPEndPoint(IPAddress.Parse("192.168.1.100"), Convert.ToInt32(2000));
2000已经是一个int。