Первоначально я пытался написать небольшое консольное приложение для локальной отправки UDP-пакетов, чтобы я мог протестировать свое приложение-получатель.Ища здесь на Переполнении Стека, мне удалось получить кое-что, что работало.Но это работает только иногда .Я знаю, что UDP ненадежен, но в этом случае он либо полностью работает, либо не работает вообще.
Я пытался сократить код до абсолютного минимума.Если вы скопируете эти два блока кода в main
двух разных консольных приложений и запустите их вместе (вне VS), мне было бы интересно узнать, работает ли:
- для вас:когда-либо, никогда или все время
- если вы видите какую-либо разницу в зависимости от того, что вы запускаете / останавливаете первым
- у вас есть какие-либо идеи, что не такЯ оставляю Отправителя включенным и останавливаю / запускаю Приемник дюжину раз, он переходит в состояние, когда он ничего не получает.Если вы продолжите попытки, он снова начинает работать, затем останавливается, а затем начинает ...
UdpReceiver
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();
UdpSender
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();