[英]Broadcast-Mono vs Core
我在 Linux 上观察到一件奇怪的事情。下面的简单代码通过整个 LAN 进行广播。 我将该简单项目编译为核心项目和/或 Mono 项目(均适用于 Linux)。 它们似乎工作正常,但只有从 Mono 编译我才能捕获 UDP 数据包,否则不能(使用 Core)。
public sealed class Broadcaster : IDisposable
{
readonly IPEndPoint _ipEndPoint;
readonly object _locker = new object();
readonly Dictionary<string, UdpClient> _clients = new Dictionary<string, UdpClient>();
public Broadcaster(ushort broadcastPort)
{
_ipEndPoint = new IPEndPoint(IPAddress.Broadcast, broadcastPort);
}
public void Send(string message)
{
var data = Encoding.ASCII.GetBytes(message);
var host = Dns.GetHostEntry(Dns.GetHostName());
var addressList = host.AddressList;
var ip = addressList.Last();
var ip_ = ip.ToString();
lock (_locker)
{
if (!_clients.ContainsKey(ip_))
_clients.Add(ip_, new UdpClient(new IPEndPoint(ip, 0)));
}
try
{
_clients[ip_].SendAsync(data, data.Length, _ipEndPoint);
Console.WriteLine($"broadcast: {DateTime.UtcNow}");
}
catch (Exception ex)
{
Console.WriteLine($"unable to use host {ip} while broadcasting: " + ex);
}
}
public void Dispose()
{
try
{
lock (_locker)
{
foreach (var client in _clients)
{
client.Value.Close();
client.Value.Dispose();
}
_clients.Clear();
}
}
catch (Exception ex)
{
Console.WriteLine("Network boadcaster finishing: " + ex);
}
}
}
...及其用法:
static async Task Main(string[] args)
{
var broadcaster = new Broadcaster(15015);
while (true)
{
broadcaster.Send($"Broadcaster: { DateTime.UtcNow.ToString("HH:mm:ss.fff")}");
await Task.Delay(1000);
}
}
已经检查过(bash - Linux 上没有图形用户界面):
请问核心版Broadcaster有什么问题? 我是否需要更改它,或者告诉 Linux“嘿这个应用程序允许广播,或者什么”? Mono 与 Core 有何不同?
与本机套接字 API 通话时,不同的实现设置不同的默认值。因此,在您的情况下,您应该将UdpClient.EnableBroadcast
设置为true
,以便 .NET Core 可以发送广播请求。
参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.