konya Posted Wednesday at 03:51 AM Posted Wednesday at 03:51 AM (edited) "MemberShip_UDF.au3 expandcollapse popup#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 Wednesday at 07:07 AM by konya argumentum 1 Read Public or Pravite key information data tool (Read PEM) GDI+ Image deskew and crop Multicast membership UDF
argumentum Posted Wednesday at 04:12 AM Posted Wednesday at 04:12 AM (edited) Nice. Thanks for sharing I'll remove this working version once you update yours: Spoiler expandcollapse popup#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 Wednesday at 06:48 AM by argumentum Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now