加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#中的UDP在Windows上工作,但不是Linux

发布时间:2020-12-15 06:28:31 所属栏目:百科 来源:网络整理
导读:我使用单声道来构建一个需要使用UDP发送和接收的C#程序.目前,我的实现在 Windows上按预期方式工作,但是我有通信问题可以与我的Ubuntu或Fedora系统配合使用. Windows可以广播和接收它自己的数据报. Ubuntu可以广播和接收它自己的数据报.它的广播是由Windows接
我使用单声道来构建一个需要使用UDP发送和接收的C#程序.目前,我的实现在 Windows上按预期方式工作,但是我有通信问题可以与我的Ubuntu或Fedora系统配合使用.

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

当数据报无法访问任何一台linux机器时,’receive’功能从不被触发.

这是我到目前为止

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());
        }
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读