多网卡UDP多播的问题,指定某一网卡加入多播,而非系统默认

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多网卡UDP多播的问题,指定某一网卡加入多播,而非系统默认相关的知识,希望对你有一定的参考价值。

Dim GroupIP As IPAddress = IPAddress.Parse("230.100.100.100")

Try
GroupUDP = New UdpClient(4601)
Dim ReceiveMessage As [Byte]()
Dim ReceiveMessageStr As String
'定义广播的址址和端口
GroupEP = New IPEndPoint(GroupIP, 4601)
'加入群组
GroupUDP.JoinMulticastGroup(GroupIP, 12)
'向群组广播,向群组内广播我来了,广播内容 COMING%%MYNAME
GroupUDP.Send(Encoding.Unicode.GetBytes(COMING & SStr & MyName), Encoding.Unicode.GetBytes(COMING & SStr & MyName).Length, GroupEP)
Do
'接收其它客户端的消息(我来了,我在线,我离线)
ReceiveMessage = GroupUDP.Receive(GroupEP)
ReceiveMessageStr = Encoding.Unicode.GetString(ReceiveMessage)
'If ReceiveMessageStr > 1 Then
Thread.Sleep(100)
'调用程序对收到的数据包分析
Call RefreshUser(ReceiveMessageStr, GroupEP.Address.ToString)
'End If
Loop
Catch ex As Exception
'MessageBox.Show(ex.Message)
End Try

如果一台电脑有多个网卡的话,上述代码只会指定某一个网卡加入多播,请问如何指定某一网卡加入多播?
'加入群组
GroupUDP.JoinMulticastGroup(GroupIP, 12)
这句换成如下
GroupUDP.JoinMulticastGroup(GroupIP, LOCALIPADDRESS)还是不行,别人找的到我,但自己还是找不到自己,接收信息的时候还是从默认的网卡上接收,而不是从指定的网卡上接收。

还是没人会,只好用广播解决了.....
其实我有尝 试将多个网卡都加入到多播组中,但还是不理想

GroupUDP.JoinMulticastGroup(GroupIP, LOCALIPADDRESS1)
GroupUDP.JoinMulticastGroup(GroupIP, LOCALIPADDRESS2)
GroupUDP.JoinMulticastGroup(GroupIP, LOCALIPADDRESS3)

参考技术A 网络被偷线,但由于网卡在你的电脑上,你能读取他的内容 参考技术B GroupUDP = New UdpClient(4601) 参考技术C 我也想知道怎么做,正在困惑呢!!!

使用 Windows 进行多播

【中文标题】使用 Windows 进行多播【英文标题】:Multicasting with Windows 【发布时间】:2018-10-11 12:55:45 【问题描述】:

我需要编写一个在 Windows 上运行并接收多播消息的应用程序。 我有一些具体的问题。

我通常使用 Winsock 控件,但它不支持多播操作。任何人都可以通过 API 帮助解决这个问题,或者我是否需要自定义 OCX。

我的 PC 网卡将连接到本地网络。 如何配置我的 PC 以允许多播数据到达我的应用程序。

【问题讨论】:

【参考方案1】:

您可以使用 UDP 套接字接收多播数据包,VB 的 WinSock 确实支持该套接字。但是,您必须使用底层 Winsock API setsockopt() 函数(WinSock 控件不支持该函数)将套接字实际加入将接收数据包的多播组。

幸运的是,WinSock 控件确实有一个SocketHandle 属性,您可以使用它来访问实际的套接字,以便您可以手动将其传递给setsockopt()

我从谷歌搜索“vb winsock multicast”得到的第一个结果是:

IP Multicasting with Winsock control

这显示了如何做到这一点:

将 IP 多播功能添加到 VB 的 Winsock 控件很容易。首先,创建一个新的标准 EXE 项目,将其命名为 Sender。将窗体的 Caption 属性设置为 MSender。在窗体上绘制 TextBox 和 WinSock 控件。设置 WinSock 的 Protocol 属性为 sckUDPProtocol,RemoteHost 为 224.0.0.1,RemotePort 为 9000。将下面的代码添加到表单并保存项目。

'**************************************
' Name: IP Multicasting with Winsock con
'     trol
' Description:Implements IP multicasting
'     
' By: Iulianos Kakulidis (from psc cd)
'
'
' Inputs:None
'
' Returns:None
'
'Assumes:None
'
'Side Effects:None
'**************************************

Private Sub Form_Load()
    Winsock1.Bind 5000
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyReturn Then
        Winsock1.SendData Text1.Text
        Text1.SelStart = 0
        Text1.SelLength = Len(Text1.Text)
    End If
End Sub

现在,创建新项目,将其命名为 Listener,将表单的 Caption 属性设置为 MListener。在窗体上绘制 TextBox 和 WinSock 控件。将 WinSock 的 Protocol 属性设置为 sckUDPProtocol。将 TextBox 的 MultiLine 属性设置为 true,将 ScrollBars 设置为 3(两者)。将下面的代码添加到表单中。

Private Sub Form_Load()
    Dim ipmreq As ipm_req
    Winsock1.Bind 9000
    ipmreq.ipm_multiaddr = inet_addr("224.0.0.1")
    ipmreq.ipm_interface = 0
    'join group
    setsockopt Winsock1.SocketHandle, _
    0, 5, ipmreq, Len(ipmreq)
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim stdata As String
    Winsock1.GetData stdata
    Text1.Text = Text1.Text & Chr$(13) & Chr$(10) & stdata
End Sub

使用下面的代码将模块添加到监听器项目中,保存项目。

'**************************************
'Windows API/Global Declarations for :IP
'     Multicasting with Winsock control
'**************************************

Public Type ipm_req
    ipm_multiaddr As Long
    ipm_interface As Long
    End Type

Public Declare Function setsockopt Lib "wsock32" _
    (ByVal s As Integer, ByVal level As Integer, _
    ByVal optname As Integer, ByRef optval As Any, ByVal optlen As Integer) As Integer

Public Declare Function inet_addr Lib "wsock32" _
        (ByVal cp As String) As Long

运行 Sender 和 Listener 应用程序。在 Sender 的 TextBox 中输入 message,按 Enter,相同的文本将出现在 Listener 窗体的 TextBox 中。在本地网络上测试

【讨论】:

尝试在 Win 10 上同时运行此代码。在发件人应用程序上获取运行时错误 10065“no route to host”。

以上是关于多网卡UDP多播的问题,指定某一网卡加入多播,而非系统默认的主要内容,如果未能解决你的问题,请参考以下文章

绑定多播 (UDP) 套接字是啥意思?

使用 Windows 进行多播

套接字没有加入多播组,但它可以接收数据。

Heartbeat配置多播方式以及heartbeat安装脚本

网络硬件7.IP多播的概念

网络硬件7.IP多播的概念