我有一个方法来创建一堆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;
}
}
}
字符串
1条答案
按热度按时间iibxawm41#
我发现了这个地址被使用的原因,尽管我认为它没有被使用。我在我的机器上运行Parallels以支持Windows,并在Parallels中创建了一个端口转发规则,该规则绑定到该端口上的每个接口。删除端口转发规则导致了预期的操作。