Многоадресная рассылка с Windows - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно написать приложение, которое работает в Windows и получает многоадресные сообщения.У меня есть несколько конкретных вопросов.

Я обычно использую элемент управления Winsock, но из коробки он не поддерживает многоадресные операции.Может кто-нибудь помочь с API, чтобы обойти это, или мне нужно, но пользовательский OCX.

Мой сетевой адаптер ПК будет подключен к локальной сети.Как настроить мой компьютер так, чтобы данные многоадресной рассылки доходили до моего приложения.

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете получать многоадресные пакеты, используя 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 в форме слушателя.Проверено в локальной сети

...