我需要编写一个在Windows上运行并接收多播消息的应用程序。 我有一些具体的问题。
我通常使用 Winsock 控件,但开箱即用它不支持多播操作。任何人都可以帮助 API 解决这个问题,或者我是否需要自定义 OCX。
我的 PC 网卡将连接到本地网络。 如何配置我的电脑以允许多播数据到达我的应用程序。
您可以使用 UDP 套接字接收组播数据包,VB 的WinSock
确实支持该套接字。 但是,必须使用基础 Winsock APIsetsockopt()
函数(WinSock
控件不支持该函数(才能将套接字实际加入将从中接收数据包的多播组。
幸运的是,WinSock
控件确实具有SocketHandle
属性,可用于访问实际套接字,以便手动将其传递给setsockopt()
。
我从谷歌搜索"vb winsock multicast"中得到的第一个结果是:
具有温索克控制的 IP 多播
这确切地显示了如何做到这一点:
将 IP 多播功能添加到 VB 的 Winsock 控件中很容易。首先,创建一个新的标准 EXE 项目,将其命名为 Sender。将窗体的"标题"属性设置为"MSender"。在窗体上绘制文本框和 WinSock 控件。将 WinSock 的协议属性设置为 sckUDPProtocol,将远程主机设置为 224.0.0.1,将远程端口设置为 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
现在,创建新项目,将其命名为侦听器,将窗体的 Caption 属性设置为 MListener。在窗体上绘制文本框和 WinSock 控件。将 WinSock 的 Protocol 属性设置为 sckUDPProtocol。将文本框的属性"多行"设置为 true,将"滚动条"设置为 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
运行发送方和侦听器应用程序。在发件人的文本框中键入消息,按 Enter,相同的文本将出现在侦听器窗体上的文本框中。在本地网络上测试