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

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

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

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

【问题讨论】:

    标签: windows vb6 winsock multicast


    【解决方案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”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2015-10-21
    相关资源
    最近更新 更多