本篇使用环境:
- 单播可以播出去
- 局域网用 “255.255.255.255”/Broadcast 广播消息播不出去
- 前提是关闭了虚拟网卡等一系列用不到的网卡,还是播不出去。关闭路径:“控制面板\所有控制面板项\网络连接”
具体原因看下面的介绍链接吧
直接广播地址和受限广播地址的介绍:https://zhidao.baidu.com/question/79080266.html
受限广播地址:
主机位、网络为全为1(即255):255.255.255.255
用于IP地址请求阶段
直接广播地址:
主机位为1(即255),网络位正常:192.168.1.255
用于子网广播
具体使用方法就是把Broadcast改为直接广播地址:
直接广播地址的C#计算方式如下:
**
广播地址 = 子网掩码按位 求反 再 或 IP地址
**
public IPAddress IpAddress;
public IPAddress SubnetMask;
public IPAddress BroadcastIP;
void RunFunction()
{
IpAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList.Last();
SubnetMask = GetSubnetMask(IpAddress);
BroadcastIP = GetBroadcast(IpAddress, SubnetMask);
}
/// <summary>
/// 获得广播地址
/// </summary>
/// <param name="ipAddress">IP地址</param>
/// <param name="subnetMask">子网掩码</param>
/// <returns>广播地址</returns>
IPAddress GetBroadcast(IPAddress ipAddress, IPAddress subnetMask)
{
byte[] ipAdd = ipAddress.GetAddressBytes();
byte[] subnet = subnetMask.GetAddressBytes();
for (int i = 0; i < ipAdd.Length; i++)
{
ipAdd[i] = (byte)(~subnet[i] | ipAdd[i]);
}
return new IPAddress(ipAdd);
}
/// <summary>
/// 获取子网掩码
/// </summary>
/// <param name="ipAdd">IP地址</param>
/// <returns></returns>
IPAddress GetSubnetMask(IPAddress ipAdd)
{
foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses)
{
if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork)
{
if (ipAdd.Equals(unicastIPAddressInformation.Address))
{
return unicastIPAddressInformation.IPv4Mask;
}
}
}
}
//return IPAddress.Parse("255.255.255.0");
throw new ArgumentException($"没有发现该{ipAdd}对应的子网掩码");
}