Jump to content

Recommended Posts

Posted (edited)

"MemberShip_UDF.au3

#include-once ; #include "MemberShip_UDF.au3" ; https://www.autoitscript.com/forum/topic/213775-multicast-membership-udf/

; =======================================================================================================================
; Global Constants & Variables
; =======================================================================================================================
Global Const $IPPROTO_IP = 0
; https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
Global Const $IP_MULTICAST_IF = 9
Global Const $IP_MULTICAST_TTL = 10
Global Const $IP_MULTICAST_LOOP = 11
Global Const $IP_ADD_MEMBERSHIP = 12
Global Const $IP_DROP_MEMBERSHIP = 13

Global $__g_MSUDF_MultiCast_Server_Socket, $__MSUDF_MultiCast_Client_Socket
Global $__g_MSUDF_injoin_struct ; intenal use globals


; =======================================================================================================================
; Function ....: MultiCast_Server_Socket
; Description ..: Retrieves the internal handle/array structure of the current multicast server socket (listener).
; Return values : Success - Array containing the socket identifier and details.
;                 Failure - 0 or uninitialized variable if the server socket has not been bound.
; =======================================================================================================================
Func MultiCast_Server_Socket()
    Return $__g_MSUDF_MultiCast_Server_Socket
EndFunc

; =======================================================================================================================
; Function ....: MultiCast_Client_Socket
; Description ..: Retrieves the internal handle/array structure of the current multicast client socket (sender).
; Return values : Success - Array containing the socket identifier and details.
;                 Failure - 0 or uninitialized variable if the client socket has not been opened.
; =======================================================================================================================
Func MultiCast_Client_Socket()
    Return $__MSUDF_MultiCast_Client_Socket
EndFunc

; =======================================================================================================================
; Function ....: Multicast_UDPStart
; Description ..: Initializes the AutoIt UDP service.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPStartup error code.
; =======================================================================================================================
Func Multicast_UDPStart()
    Local $iResult = UDPStartup()
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPStart

; =======================================================================================================================
; Function ....: Multicast_UDPOpen
; Description ..: Opens a UDP socket for sending multicast data.
; Parameters ...: $Multicast_IP - The target multicast IP address.
;                 $port         - The target port.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPOpen error code.
; =======================================================================================================================
Func Multicast_UDPOpen($Multicast_IP, $port)
    $__MSUDF_MultiCast_Client_Socket = UDPOpen($Multicast_IP, $port)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPOpen

; =======================================================================================================================
; Function ....: Multicast_UDPBind
; Description ..: Binds a socket to a local interface and port to listen for incoming data.
; Parameters ...: $NIC_IP - The IP address of the local network interface card.
;                 $port   - The port to bind to.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPBind error code.
; =======================================================================================================================
Func Multicast_UDPBind($NIC_IP, $port)
    $__g_MSUDF_MultiCast_Server_Socket = UDPBind($NIC_IP, $port)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPBind

; =======================================================================================================================
; Function ....: Multicast_Send
; Description ..: Sends a message via the opened multicast client socket.
; Parameters ...: $message - The string or binary data to transmit.
; Return values : Success - Number of bytes sent.
;                 Failure - False, sets @error to the native AutoIt UDPSend error code.
; =======================================================================================================================
Func Multicast_Send($message)
    Local $iResult = UDPSend($__MSUDF_MultiCast_Client_Socket, $message)
    If @error Then Return SetError(@error, 0, False)
    Return $iResult
EndFunc   ;==>Multicast_Send

; =======================================================================================================================
; Function ....: Multicast_IF
; Description ..: Sets the outgoing network interface card for multicast traffic.
; Parameters ...: $sSendNIC_IP - The local IP address of the card to send traffic out of.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed (ws2_32.dll missing/unreachable).
;                           @error = 3: Invalid local IP address string provided.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_IF($sSendNIC_IP)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $aCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $sSendNIC_IP)
    If @error Then Return SetError(2, 0, False)

    Local $iNIC_Addr = $aCall[0]
    If $iNIC_Addr = 0xFFFFFFFF Then Return SetError(3, 0, False)

    Local $tInAddr = DllStructCreate("ulong s_addr;")
    DllStructSetData($tInAddr, "s_addr", $iNIC_Addr)

    Local $aIfCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint_ptr", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_IF, _
            "ptr", DllStructGetPtr($tInAddr), _
            "int", DllStructGetSize($tInAddr))

    If @error Then Return SetError(2, 0, False)

    If $aIfCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_IF

; =======================================================================================================================
; Function ....: Multicast_TTL
; Description ..: Sets the Time-To-Live (TTL) for outgoing multicast packets.
; Parameters ...: $ttl - Number of router hops allowed (Default = 32).
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_TTL($ttl = 32)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $tTTL = DllStructCreate("int ttl;")
    DllStructSetData($tTTL, "ttl", $ttl)

    Local $aTtlCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_TTL, _
            "ptr", DllStructGetPtr($tTTL), _
            "int", DllStructGetSize($tTTL))

    If @error Then Return SetError(2, 0, False)

    If $aTtlCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_TTL

; =======================================================================================================================
; Function ....: Multicast_Loop
; Description ..: Controls whether sent multicast packets are looped back to the local host.
; Parameters ...: $control - 1 to enable loopback (default), 0 to disable it.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Loop($control = 1)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $tLoopback = DllStructCreate("int optval;")
    DllStructSetData($tLoopback, "optval", $control)

    Local $aLoopCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_LOOP, _
            "ptr", DllStructGetPtr($tLoopback), _
            "int", DllStructGetSize($tLoopback))

    If @error Then Return SetError(2, 0, False)

    If $aLoopCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_Loop

; =======================================================================================================================
; Function ....: Multicast_Add
; Description ..: Joins a specific multicast group on a designated network interface.
; Parameters ...: $Multicast_IP - The multicast group IP address to join (e.g., 239.255.0.1).
;                 $NIC_IP       - The local IP address of the card joining the group.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 3: Invalid Multicast or Local IP string format.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Add($Multicast_IP, $NIC_IP)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $aMultiCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $Multicast_IP)
    Local $aInterfaceCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $NIC_IP)
    If @error Then Return SetError(2, 0, False)

    Local $aMultiAddr = $aMultiCall[0]
    Local $aInterface = $aInterfaceCall[0]
    If $aMultiAddr = 0xFFFFFFFF Or $aInterface = 0xFFFFFFFF Then Return SetError(3, 0, False)

    $__g_MSUDF_injoin_struct = DllStructCreate("byte imr_multiaddr[4]; byte imr_interface[4];")
    DllStructSetData($__g_MSUDF_injoin_struct, "imr_multiaddr", $aMultiAddr)
    DllStructSetData($__g_MSUDF_injoin_struct, "imr_interface", $aInterface)

    Local $aResult = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_ADD_MEMBERSHIP, _
            "ptr", DllStructGetPtr($__g_MSUDF_injoin_struct), _
            "int", DllStructGetSize($__g_MSUDF_injoin_struct))

    If @error Then Return SetError(2, 0, False)

    If $aResult[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_Add

; =======================================================================================================================
; Function ....: Multicast_Drop
; Description ..: Drops membership from the currently joined multicast group.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket/Struct not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Drop()
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Or Not IsDllStruct($__g_MSUDF_injoin_struct) Then Return SetError(1, 0, False)

    Local $aDropCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint_ptr", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_DROP_MEMBERSHIP, _
            "ptr", DllStructGetPtr($__g_MSUDF_injoin_struct), _
            "int", DllStructGetSize($__g_MSUDF_injoin_struct))

    If @error Then Return SetError(2, 0, False)

    If $aDropCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    $__g_MSUDF_injoin_struct = 0 ; Clear struct allocation
    Return True
EndFunc   ;==>Multicast_Drop

Demo

#include <Array.au3>
#include "MemberShip_UDF.au3"




Local $Multicast_IP = "239.12.13.14"
Local $NIC_IP = "0.0.0.0"
Local $port = "5678"
Multicast_UDPStart()

Multicast_UDPBind($NIC_IP, $port)
Multicast_Add($Multicast_IP , $NIC_IP)

;Multicast_IF("127.0.0.1")
;Multicast_TTL(4)
Multicast_Loop(1)
Multicast_UDPOpen($Multicast_IP, $port)


Multicast_Send("test0")
Local $sData = UDPRecv($__g_MSUDF_MultiCast_Server_Socket, 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

Multicast_Loop(0)
Multicast_Send("test1")
Local $sData = UDPRecv($__g_MSUDF_MultiCast_Server_Socket, 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

Multicast_Loop(1)
Multicast_Send("test2")
Local $sData = UDPRecv($__g_MSUDF_MultiCast_Server_Socket, 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

 

Edited by konya
Posted (edited)

Nice. Thanks for sharing :) 

I'll remove this working version once you update yours:
 

Spoiler
#include-once ; #include "MemberShip_UDF.au3" ; https://www.autoitscript.com/forum/topic/213775-multicast-membership-udf/

; =======================================================================================================================
; Global Constants & Variables
; =======================================================================================================================
Global Const $IPPROTO_IP = 0
; https://learn.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
Global Const $IP_MULTICAST_IF = 9
Global Const $IP_MULTICAST_TTL = 10
Global Const $IP_MULTICAST_LOOP = 11
Global Const $IP_ADD_MEMBERSHIP = 12
Global Const $IP_DROP_MEMBERSHIP = 13

Global $__g_MSUDF_MultiCast_Server_Socket, $__MSUDF_MultiCast_Client_Socket
Global $__g_MSUDF_injoin_struct ; intenal use globals


; =======================================================================================================================
; Function ....: MultiCast_Server_Socket
; Description ..: Retrieves the internal handle/array structure of the current multicast server socket (listener).
; Return values : Success - Array containing the socket identifier and details.
;                 Failure - 0 or uninitialized variable if the server socket has not been bound.
; =======================================================================================================================
Func MultiCast_Server_Socket()
    Return $__g_MSUDF_MultiCast_Server_Socket
EndFunc

; =======================================================================================================================
; Function ....: MultiCast_Client_Socket
; Description ..: Retrieves the internal handle/array structure of the current multicast client socket (sender).
; Return values : Success - Array containing the socket identifier and details.
;                 Failure - 0 or uninitialized variable if the client socket has not been opened.
; =======================================================================================================================
Func MultiCast_Client_Socket()
    Return $__MSUDF_MultiCast_Client_Socket
EndFunc

; =======================================================================================================================
; Function ....: Multicast_UDPStart
; Description ..: Initializes the AutoIt UDP service.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPStartup error code.
; =======================================================================================================================
Func Multicast_UDPStart()
    Local $iResult = UDPStartup()
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPStart

; =======================================================================================================================
; Function ....: Multicast_UDPOpen
; Description ..: Opens a UDP socket for sending multicast data.
; Parameters ...: $Multicast_IP - The target multicast IP address.
;                 $port         - The target port.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPOpen error code.
; =======================================================================================================================
Func Multicast_UDPOpen($Multicast_IP, $port)
    $__MSUDF_MultiCast_Client_Socket = UDPOpen($Multicast_IP, $port)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPOpen

; =======================================================================================================================
; Function ....: Multicast_UDPBind
; Description ..: Binds a socket to a local interface and port to listen for incoming data.
; Parameters ...: $NIC_IP - The IP address of the local network interface card.
;                 $port   - The port to bind to.
; Return values : Success - True
;                 Failure - False, sets @error to the native AutoIt UDPBind error code.
; =======================================================================================================================
Func Multicast_UDPBind($NIC_IP, $port)
    $__g_MSUDF_MultiCast_Server_Socket = UDPBind($NIC_IP, $port)
    If @error Then Return SetError(@error, 0, False)
    Return True
EndFunc   ;==>Multicast_UDPBind

; =======================================================================================================================
; Function ....: Multicast_Send
; Description ..: Sends a message via the opened multicast client socket.
; Parameters ...: $message - The string or binary data to transmit.
; Return values : Success - Number of bytes sent.
;                 Failure - False, sets @error to the native AutoIt UDPSend error code.
; =======================================================================================================================
Func Multicast_Send($message)
    Local $iResult = UDPSend($__MSUDF_MultiCast_Client_Socket, $message)
    If @error Then Return SetError(@error, 0, False)
    Return $iResult
EndFunc   ;==>Multicast_Send

; =======================================================================================================================
; Function ....: Multicast_IF
; Description ..: Sets the outgoing network interface card for multicast traffic.
; Parameters ...: $sSendNIC_IP - The local IP address of the card to send traffic out of.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed (ws2_32.dll missing/unreachable).
;                           @error = 3: Invalid local IP address string provided.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_IF($sSendNIC_IP)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $aCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $sSendNIC_IP)
    If @error Then Return SetError(2, 0, False)

    Local $iNIC_Addr = $aCall[0]
    If $iNIC_Addr = 0xFFFFFFFF Then Return SetError(3, 0, False)

    Local $tInAddr = DllStructCreate("ulong s_addr;")
    DllStructSetData($tInAddr, "s_addr", $iNIC_Addr)

    Local $aIfCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint_ptr", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_IF, _
            "ptr", DllStructGetPtr($tInAddr), _
            "int", DllStructGetSize($tInAddr))

    If @error Then Return SetError(2, 0, False)

    If $aIfCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_IF

; =======================================================================================================================
; Function ....: Multicast_TTL
; Description ..: Sets the Time-To-Live (TTL) for outgoing multicast packets.
; Parameters ...: $ttl - Number of router hops allowed (Default = 32).
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_TTL($ttl = 32)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $tTTL = DllStructCreate("int ttl;")
    DllStructSetData($tTTL, "ttl", $ttl)

    Local $aTtlCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_TTL, _
            "ptr", DllStructGetPtr($tTTL), _
            "int", DllStructGetSize($tTTL))

    If @error Then Return SetError(2, 0, False)

    If $aTtlCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_TTL

; =======================================================================================================================
; Function ....: Multicast_Loop
; Description ..: Controls whether sent multicast packets are looped back to the local host.
; Parameters ...: $control - 1 to enable loopback (default), 0 to disable it.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Loop($control = 1)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $tLoopback = DllStructCreate("int optval;")
    DllStructSetData($tLoopback, "optval", $control)

    Local $aLoopCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_MULTICAST_LOOP, _
            "ptr", DllStructGetPtr($tLoopback), _
            "int", DllStructGetSize($tLoopback))

    If @error Then Return SetError(2, 0, False)

    If $aLoopCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_Loop

; =======================================================================================================================
; Function ....: Multicast_Add
; Description ..: Joins a specific multicast group on a designated network interface.
; Parameters ...: $Multicast_IP - The multicast group IP address to join (e.g., 239.255.0.1).
;                 $NIC_IP       - The local IP address of the card joining the group.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 3: Invalid Multicast or Local IP string format.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Add($Multicast_IP, $NIC_IP)
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Then Return SetError(1, 0, False)

    Local $aMultiCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $Multicast_IP)
    Local $aInterfaceCall = DllCall("ws2_32.dll", "ulong", "inet_addr", "str", $NIC_IP)
    If @error Then Return SetError(2, 0, False)

    Local $aMultiAddr = $aMultiCall[0]
    Local $aInterface = $aInterfaceCall[0]
    If $aMultiAddr = 0xFFFFFFFF Or $aInterface = 0xFFFFFFFF Then Return SetError(3, 0, False)

    $__g_MSUDF_injoin_struct = DllStructCreate("byte imr_multiaddr[4]; byte imr_interface[4];")
    DllStructSetData($__g_MSUDF_injoin_struct, "imr_multiaddr", $aMultiAddr)
    DllStructSetData($__g_MSUDF_injoin_struct, "imr_interface", $aInterface)

    Local $aResult = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_ADD_MEMBERSHIP, _
            "ptr", DllStructGetPtr($__g_MSUDF_injoin_struct), _
            "int", DllStructGetSize($__g_MSUDF_injoin_struct))

    If @error Then Return SetError(2, 0, False)

    If $aResult[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    Return True
EndFunc   ;==>Multicast_Add

; =======================================================================================================================
; Function ....: Multicast_Drop
; Description ..: Drops membership from the currently joined multicast group.
; Return values : Success - True
;                 Failure - False
;                           @error = 1: Socket/Struct not initialized or invalid array structure.
;                           @error = 2: DllCall failed.
;                           @error = 4: WinSock setsockopt failed. @extended contains the WinSock error code.
; =======================================================================================================================
Func Multicast_Drop()
    If Not IsArray($__g_MSUDF_MultiCast_Server_Socket) Or UBound($__g_MSUDF_MultiCast_Server_Socket) < 2 Or Not IsDllStruct($__g_MSUDF_injoin_struct) Then Return SetError(1, 0, False)

    Local $aDropCall = DllCall("ws2_32.dll", "int", "setsockopt", _
            "uint_ptr", $__g_MSUDF_MultiCast_Server_Socket[1], _
            "int", $IPPROTO_IP, _
            "int", $IP_DROP_MEMBERSHIP, _
            "ptr", DllStructGetPtr($__g_MSUDF_injoin_struct), _
            "int", DllStructGetSize($__g_MSUDF_injoin_struct))

    If @error Then Return SetError(2, 0, False)

    If $aDropCall[0] <> 0 Then
        Local $aErr = DllCall("ws2_32.dll", "int", "WSAGetLastError")
        Return SetError(4, @error ? 0 : $aErr[0], False)
    EndIf

    $__g_MSUDF_injoin_struct = 0 ; Clear struct allocation
    Return True
EndFunc   ;==>Multicast_Drop

 

demo:

#include <Array.au3>
#include <WinAPIDiag.au3>
#include "MemberShip_UDF.au3"


Local $Multicast_IP = "239.12.13.14"
Local $NIC_IP = "0.0.0.0"
Local $port = "5678"
Multicast_UDPStart()

Multicast_UDPBind($NIC_IP, $port)
Multicast_Add($Multicast_IP , $NIC_IP)

;Multicast_IF("127.0.0.1")
;Multicast_TTL(4)
Multicast_Loop(1)
Multicast_UDPOpen($Multicast_IP, $port)


Multicast_Send("test0")
Local $sData = UDPRecv(MultiCast_Server_Socket(), 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

Multicast_Loop(0)
Multicast_Send("test1")
Local $sData = UDPRecv(MultiCast_Server_Socket(), 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

Multicast_Loop(1)
Multicast_Send("test2")
Local $sData = UDPRecv(MultiCast_Server_Socket(), 4096, 1)
MsgBox(0,"",BinaryToString($sData,4))

 

 

Edited by argumentum

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting  image.gif.922e3a93535f431de08b31ee669cc446.gif
autoit_scripter_blue_userbar.png

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...