2013-03-06 80 views
0

我试图在所有的网络接口(2个LAN,一个wifi)上发送一个组播数据包。我最初跟在这tutorial在我所有的IP上发送一个UDP组播数据包

我遇到的问题是,似乎该数据包似乎只与我的一个IP地址。

这是我目前的代码。

private static void SendOnAllCards(int port, String address) 
{ 
    using (Socket mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
    { 
     mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, 
            new MulticastOption(IPAddress.Parse(address))); 
     mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255); 
     mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     mSendSocket.Bind(new IPEndPoint(IPAddress.Any, port)); 
     IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(address), port); 
     mSendSocket.Connect(ipep); 


     byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message"); 
     mSendSocket.Send(bytes, bytes.Length, SocketFlags.None); 
    } 
} 

我试图做手工:

private static void SendOnAllCards(int port, string remoteAddressSrc) 
{ 
    foreach (IPAddress remoteAddress in Dns.GetHostAddresses(Dns.GetHostName()).Where(i=>i.AddressFamily == AddressFamily.InterNetwork)) 
    { 

     using (Socket mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
     { 
      mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, 
             new MulticastOption(IPAddress.Parse(remoteAddressSrc))); 
      mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255); 
      mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
      mSendSocket.Bind(new IPEndPoint(IPAddress.Any, port)); 
      IPEndPoint ipep = new IPEndPoint(remoteAddress, port); 
      mSendSocket.Connect(ipep); 


      byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message"); 
      mSendSocket.Send(bytes, bytes.Length, SocketFlags.None); 
     } 
    } 
} 

这工作,但它意味着我已经创造尽可能多的插座,我已经IP(在此示例中我在每个创建它们发送,但这只是一个测试),我不喜欢我获得所有IP的方式。

那么这样做的正确方法是什么?

编辑秒奖金的问题:为什么是这个工作的时候我指定的Connect本地IP,其指定的远程地址,但不会对Bind

回答

1

看来,我们不得不遍历网络接口,使在本地IP绑定和做好友* *电话:

public void SendTestMessage() 
{ 
    foreach (IPAddress localIp in 
     Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork)) 
    { 
     IPAddress ipToUse = localIp; 
     using (var mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
     { 
      mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, 
             new MulticastOption(_multicastIp, localIp)); 
      mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255); 
      mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
      mSendSocket.MulticastLoopback = true; 
      mSendSocket.Bind(new IPEndPoint(ipToUse, _port)); 


      byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message"); 
      var ipep = new IPEndPoint(_multicastIp, _port); 
      mSendSocket.SendTo(bytes, ipep); 
     } 
    } 
} 
0

您可以使用WMI类Win32_NetworkAdapter找到网络适配器。您可能必须改进查询实例的结果,因为Windows和第三方软件都创建了许多“虚拟适配器”。 我写了一个快速的posh脚本来检索使用WMI的适配器。这应该只显示具有IP地址的适配器。这只是为了显示您可以查询的WMI信息来检索激活的驱动程序。

$networkadapters = @(Get-CimInstance -ClassName Win32_NetworkAdapter -Property *) 
$networkadapters_configs = @($networkadapters | Get-CimAssociatedInstance -ResultClassName Win32_NetworkAdapterConfiguration) 

0..($networkadapters.Length-1) | %{ 
    if($networkadapters_configs[$_].IPAddress -gt '') { 
     Write-Output "Adapter #$($_)" 
     Write-Output $networkadapters[$_] 
     Write-Output "Config #$($_)" 
     Write-Output $networkadapters_configs[$_] 
    } 
} 
+0

我不知道,了解它如何帮我? – J4N 2013-03-06 16:05:40

+0

然后,您可以使用分配给每个网卡的IP信息来广播您的多播消息。在您的原始文章中,您正在遍历分配给主机的IP地址,但每个NIC可能有多个IP地址。这是使用WMI提取网络适配器IP绑定的示例,然后可以使用WMI准确发送这些消息。 – 2013-03-06 16:27:26

+0

我的问题不在于查找网络接口,而在于如何通过套接字将数据发送到多个接口 – J4N 2013-03-06 16:34:45