我最初试图编写一个小型控制台应用程序来在本地发送 UDP 数据包,所以我可以测试我的“接收器”应用程序。在 Stack Overflow 上搜索,我设法得到了一些有用的东西。但它只是有时有效。我知道 UDP 是不可靠的,但在这种情况下,它要么完全工作,要么根本不工作。
我试图将代码减少到绝对最小值。如果您将这两个代码块复制到main
两个不同的控制台应用程序中并将它们一起运行(在 VS 之外),我很想知道:
- 它对你有用:永远,永远,或一直
- 如果您发现任何差异取决于您首先启动/停止的哪个
- 你知道出了什么问题
如果我让 Sender 运行,并停止/启动 Receiver 十几次,它就会进入一个不会收到任何东西的状态。如果你继续尝试,它会再次开始工作,然后停止,然后开始......
UDP接收器
int port = 31572;
var udpReceiver = new UdpClient { ExclusiveAddressUse = false };
udpReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var localEP = new IPEndPoint(IPAddress.Loopback, port);
udpReceiver.Client.Bind(localEP);
Task.Factory.StartNew(() =>
{
var inEndPoint = new IPEndPoint(IPAddress.Any, 0);
while(true)
{
udpReceiver.Receive(ref inEndPoint);
Console.Write(".");
}
});
Console.ReadKey(true);
udpReceiver.Close();
发送者
var port = 31572;
UdpClient udpSender = new UdpClient { ExclusiveAddressUse = false };
udpSender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var remoteEP = new IPEndPoint(IPAddress.Loopback, port);
udpSender.Client.Bind(remoteEP);
var data = new byte[500];
var rnd = new Random();
Task.Factory.StartNew(() =>
{
while(true)
{
Console.Write(".");
rnd.NextBytes(data);
udpSender.Send(data, data.Length, remoteEP);
Thread.Sleep(1000);
}
});
Console.ReadKey(true);
udpSender.Close();