UDP客户端绑定在.NET7 for MacOS

x33g5p2x  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(68)

我有一个方法来创建一堆UDP套接字,用于向特定设备发送广播消息。这段代码在Windows上100%工作,但我的任务是创建一个MacOS版本。无论出于何种原因,我在将UdpClient Socket绑定到特定的IPEndPoint和端口时抛出SocketException(“Address already in use”)。我肯定有比我无知更愚蠢的事情,但我所有的研究都一无所获。任何帮助都是有帮助的。
MacOS 13.4.1、.NET 7.0.306

private static List<IPAddress> GetEndpoints()
    {
        List<IPAddress> AddressList = new List<IPAddress>();
        NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();

        foreach (NetworkInterface I in Interfaces)
        {
            if ((I.NetworkInterfaceType != NetworkInterfaceType.Loopback) && I.OperationalStatus == OperationalStatus.Up)
            {
                foreach (var Unicast in I.GetIPProperties().UnicastAddresses)
                {
                    if (Unicast?.Address?.AddressFamily == AddressFamily.InterNetwork)
                    {
                        AddressList.Add(Unicast.Address);
                    }
                }
            }
        }
        return AddressList;
    }

    private static void CreateSockets()
    {
        List<IPAddress> Endpoints = GetEndpoints();
        foreach (IPAddress A in Endpoints)
        {
            try
            {
                UdpClient Udp = new UdpClient();
                Udp.Client.ReceiveBufferSize = 100000;
                Udp.ExclusiveAddressUse = false;
                Udp.EnableBroadcast = true;
                Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                Udp.Client.Bind(new IPEndPoint(A, 44444));  // This line throws the exception.
                ReceiveDataAsync(Udp, ReceiveDataCallback);
                UdpClients.Add(Udp);
                if (UdpClientBuffer.ContainsKey(Udp))
                {
                    UdpClientBuffer[Udp] = String.Empty;
                }
                else
                {
                    UdpClientBuffer.Add(Udp, String.Empty);
                }
            }
            catch (Exception ex)
            {
                string S = ex.Message;
            }
        }
    }

字符串

iibxawm4

iibxawm41#

我发现了这个地址被使用的原因,尽管我认为它没有被使用。我在我的机器上运行Parallels以支持Windows,并在Parallels中创建了一个端口转发规则,该规则绑定到该端口上的每个接口。删除端口转发规则导致了预期的操作。

相关问题