Вы можете получать многоадресные пакеты, используя UDP-сокет, который поддерживает VB WinSock
.Однако вы должны использовать базовую функцию Winsock API setsockopt()
, которую не поддерживает элемент управления WinSock
, чтобы фактически присоединить сокет к группе многоадресной рассылки, от которой будут получены пакеты.
К счастью, *Элемент управления 1006 * имеет свойство SocketHandle
, которое можно использовать для доступа к фактическому сокету, чтобы вы могли передать его в setsockopt()
вручную.
Первый результат, полученный от Googling "vb winsock multicast", это:
Многоадресная IP-рассылка с управлением Winsock
Что именно показывает, как это сделать:
Легко добавить функцию многоадресной IP-рассылки в VBКонтроль Winsock.Сначала создайте новый стандартный EXE-проект, назовите его Sender.Установите для свойства Caption формы значение MSender.Нарисуйте на форме TextBox и WinSock элементы управления.Установите для свойства протокола WinSock значение 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 значение sckUDPProtocol.Установите для свойства MultiLine TextBox значение 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
Добавьте модуль в проект Listener с приведенным ниже кодом, сохраните проект.
'**************************************
'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.Введите сообщение в TextBox отправителя, нажмите Enter, тот же текст появится в TextBox в форме слушателя.Проверено в локальной сети