gpt4 book ai didi

c# - C# 中的 UDP 适用于 Windows,但不适用于 Linux

转载 作者:可可西里 更新时间:2023-11-01 12:42:06 25 4
gpt4 key购买 nike

我正在使用 mono 构建一个需要使用 UDP 发送和接收的 C# 程序。目前我的实现在 Windows 上按预期工作,但我在与我的 Ubuntu 或 Fedora 系统进行通信时遇到问题。

Windows 可以广播和接收它自己的数据报。
Ubuntu 可以广播和接收它自己的数据报。它的广播由 Windows 接收,但它看不到 Windows 广播的数据报。
Fedora 可以广播但不从任何地方(甚至不是它自己)接收数据报。它的广播由 Windows 接收。

当数据报无法到达任何一台 Linux 机器时,“接收”功能永远不会被触发。

这是我目前所拥有的:

int _port = 4568;
var server = new UdpClient(_port);
var send_UDP = new UdpClient();

receive方法使用UDPClient的异步调用;

private static void receive()
{
server.BeginReceive(new AsyncCallback(receive), null);
}
private static void receive(IAsyncResult o)
{
try
{
// I'm told that port = 0 should receive from any port.
var sender = new IPEndPoint(IPAddress.Any, 0);
var data = server.EndReceive(o, ref sender);
receive();
var str = new string(Encoding.ASCII.GetChars(data));
postmessage(sender.Address.ToString() + ":" + sender.Port.ToString() + " > " + str);
}
catch {}
}

和发送方法;

public static void send(string message)
{
var target = new IPEndPoint(IPAddress.Parse("255.255.255.255"), _port);
byte[] data = Encoding.ASCII.GetBytes(message);
send_UDP.Send(data, data.Length, target);
}

在使用 Fedora 进行一些测试后,使用 255.255.255.255 进行广播似乎是一个问题。还有其他方法吗?

最佳答案

我已经在评论中指定了这一点,但将其作为答案放置,因为您可能忽略了它并且似乎没有答案。

不要使用 255.255.255.255 进行广播,而是使用本地 IP 子网的广播地址(例如 192.168.0.1/24 子网上的 192.168.0.255)。 255.255.255.255地址不会被路由器转发(如果您的客户站点有多个子网,这就很重要),而可以转发定向广播(如果这样配置)。过去的情况是路由器默认转发定向广播,但这在 RFC2644 中有所改变。所以不要拿农场做赌注;)。

这是计算每个适配器的定向 IPV4 广播地址的示例:

public static void DisplayDirectedBroadcastAddresses()
{

foreach (var iface in NetworkInterface.GetAllNetworkInterfaces()
.Where(c => c.NetworkInterfaceType != NetworkInterfaceType.Loopback))
{
Console.WriteLine(iface.Description);
foreach (var ucastInfo in iface.GetIPProperties().UnicastAddresses
.Where(c => !c.Address.IsIPv6LinkLocal))
{
Console.WriteLine("\tIP : {0}", ucastInfo.Address);
Console.WriteLine("\tSubnet : {0}", ucastInfo.IPv4Mask);
byte[] ipAdressBytes = ucastInfo.Address.GetAddressBytes();
byte[] subnetMaskBytes = ucastInfo.IPv4Mask.GetAddressBytes();

if (ipAdressBytes.Length != subnetMaskBytes.Length) continue;

var broadcast = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcast.Length; i++)
{
broadcast[i] = (byte)(ipAdressBytes[i] | ~(subnetMaskBytes[i]));
}
Console.WriteLine("\tBroadcast: {0}", new IPAddress(broadcast).ToString());
}
}

}

关于c# - C# 中的 UDP 适用于 Windows,但不适用于 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com