Massimiliano Posted September 22, 2011 Posted September 22, 2011 Hi, If no UDP packet is received on the udpsocket, UDPRecv will hangs for 100ms. Thereis a way for down the UDPRecv timeout ? UDPStartup() $socket = UDPBind("0.0.0.0",1234) While 1 $startime = TimerInit() $udprecv = UdpRecv($socket, 10) ConsoleWrite("UDP Recv Time: " & _Timer_Diff($startime) & @CRLF) Wend UdpCloseSocket($socket) UdpShutdown() Thanks you
rover Posted September 24, 2011 Posted September 24, 2011 (edited) Hi, If no UDP packet is received on the udpsocket, UDPRecv will hangs for 100ms. Thereis a way for down the UDPRecv timeout ? Thanks you You can check the winsock receiving functions on MSDN, but I don't see any timeout options. MSDN winsock reference: http://msdn.microsoft.com/en-us/library/ms740506%28v=VS.85%29.aspx Use asynchronous sockets, or run the receiving loop in a separate process. Asynchronous sockets UDF: TCP UDF, Event driven! - based on Zatorg's asynchronous UDF: A modified UDP only version of Zatorg's asynchronous UDF. expandcollapse popup#include <WindowsConstants.au3> #include <WinAPI.au3> Opt("MustDeclareVars", 1) Opt("TrayAutoPause", 0) Global Const $FD_READ = 1, $AF_INET = 2, $SOCK_DGRAM = 2, $IPPROTO_UDP = 17 Global $UDPaddr = @IPAddress1, $UDPport = 514 Global $aUDPSocket[4] = [45454545, -1, $UDPaddr, $UDPport] ;Global array required for UDPRecv() Global $sDataBuff, $hNotifyGUI = 0 Global $hWs2_32 = DllOpen("Ws2_32.dll") OnAutoItExitRegister("_Exit") ; Start The UDP Services If UDPStartup() = 0 Then ConsoleWrite("UDPStartup() - Error starting UDP services - WSAStartup Code: " & @error & @CRLF) Exit EndIf ; Bind to an Asynchronous Socket If Not _ASyncUDP($aUDPSocket, $hNotifyGUI) Then ;optionally use existing gui in 2nd param for registering messages ConsoleWrite("_ASyncUDP() - Error binding to an Asynchronous Socket - WSAGetLastError Code: " & @extended & " Error: " & @error & @CRLF) Exit EndIf Do Until MsgBox(4096, "the cows come home... ", "") Exit ;///////////////////////////////////// ; Asynchronous UDP Socket Open ;///////////////////////////////////// Func _ASyncUDP(ByRef $aSocket, ByRef $hGUIn) Local $UDPMsg = $WM_USER + 5000, $Ret $aSocket[1] = _ASocket() ; UDP only - returns socket If @error Or $aSocket[1] = -1 Then Return SetError(@error, @extended, False) If _WinAPI_GetClassName($hGUIn) <> "AutoIt v3 GUI" Then $hGUIn = GUICreate("UDP Notify");create a hidden gui for messages if valid handle not provided If IsHWnd($hGUIn) = 0 Then Return SetError(@error, @extended, False) EndIf $Ret = _ASockSelect($aSocket[1], $hGUIn, $UDPMsg, $FD_READ) ; returns 'True or False' If @error Or $Ret = False Then Return SetError(@error, @extended, False) If Not GUIRegisterMsg($UDPMsg, "_UDPNotify") Then Return SetError(@error, @extended, False) $Ret = _ASockListen($aSocket[1], $aSocket[2], $aSocket[3]) ; returns 'True or False' If @error Or @extended Or $Ret = False Then Return SetError(@error, @extended, False) Return $Ret EndFunc ;==>_ASyncUDP ;///////////////////////////////////// ;///////////////////////////////////// ; Asynchronous UDP Socket Event Handler ;///////////////////////////////////// Func _UDPNotify($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg If BitAND($lParam, 0xFFFF) = $FD_READ Then ; The event: $FD_READ = 1 data received Switch BitShift($lParam, 16); Error: If = 0 then event indicates a success Case 0 $sDataBuff = UDPRecv($aUDPSocket, 1024) If @error Then ConsoleWrite("!Error: " & @error & " - WSAGetLastError" & _WSAGetLastError() & @CRLF) ConsoleWrite('+Syslog: ' & $sDataBuff & @CRLF) Case Else ConsoleWrite("!Error while attempting to receive data - Code: " & BitShift($lParam, 16) & @CRLF) EndSwitch EndIf EndFunc ;==>_UDPNotify Func _Exit() UDPCloseSocket($aUDPSocket) UDPShutdown() DllClose($hWs2_32) EndFunc ;==>_Exit ;AsockUDP.au3 ;UDP only edited version of Zatorgs Asynchronous sockets UDF ;XP/Vista x86 tested only ;Asynchronous sockets UDF ;http://www.autoitscript.com/forum/topic/45189-asynchronous-sockets-udf/ ;////////////////////////////////////////////////////////////// Func _ASocket() ; UDP only If $hWs2_32 = -1 Then $hWs2_32 = DllOpen("Ws2_32.dll") Local $hSocket = DllCall($hWs2_32, "uint", "socket", "int", $AF_INET, "int", $SOCK_DGRAM, "int", $IPPROTO_UDP) If @error Then Return SetError(1, @error, -1) If $hSocket[0] = -1 Then Return SetError(2, _WSAGetLastError(), -1) Return $hSocket[0] EndFunc ;==>_ASocket ;////////////////////////////////////////////////////////////// ;////////////////////////////////////////////////////////////// Func _ASockSelect($hSocket, $hWnd, $uiMsg, $iEvent) If $hWs2_32 = -1 Then $hWs2_32 = DllOpen("Ws2_32.dll") Local $iRet = DllCall($hWs2_32, "int", "WSAAsyncSelect", "uint", $hSocket, "hwnd", $hWnd, "uint", $uiMsg, "int", $iEvent) If @error Then Return SetError(1, @error, False) If $iRet[0] <> 0 Then Return SetError(2, _WSAGetLastError(), False) Return True EndFunc ;==>_ASockSelect ;////////////////////////////////////////////////////////////// ;////////////////////////////////////////////////////////////// Func __SockAddr($sIP, $iPort) Local $iRet, $tAddress If $hWs2_32 = -1 Then $hWs2_32 = DllOpen("Ws2_32.dll") $tAddress = DllStructCreate("short;ushort;uint;char[8]") If @error Then Return SetError(1, @error, False) $iRet = DllCall($hWs2_32, "ushort", "htons", "ushort", $iPort) ; ntohs If @error Or $iRet[0] <= 0 Then Return SetError(2, @error, False) DllStructSetData($tAddress, 1, $AF_INET) DllStructSetData($tAddress, 2, $iRet[0]) $iRet = DllCall($hWs2_32, "uint", "inet_addr", "str", $sIP) If @error Or $iRet[0] = 0xFFFFFFFF Then Return SetError(3, _WSAGetLastError(), False); INADDR_NONE DllStructSetData($tAddress, 3, $iRet[0]) Return $tAddress EndFunc ;==>__SockAddr ;////////////////////////////////////////////////////////////// ;////////////////////////////////////////////////////////////// Func _ASockListen($hSocket, $sIP, $uiPort) Local $iRet, $tAddress If $hWs2_32 = -1 Then $hWs2_32 = DllOpen("Ws2_32.dll") Local $tAddress = __SockAddr($sIP, $uiPort) If @error Then SetError(@error, @extended, False) $iRet = DllCall($hWs2_32, "int", "bind", "uint", $hSocket, "ptr", DllStructGetPtr($tAddress), _ "int", DllStructGetSize($tAddress)) If @error Then Return SetError(3, @error, False) If $iRet[0] <> 0 Then Return SetError(4, _WSAGetLastError(), False) Return True EndFunc ;==>_ASockListen ;////////////////////////////////////////////////////////////// ;////////////////////////////////////////////////////////////// Func _WSAGetLastError() ;MSDN - Windows Sockets Error Codes ;http://msdn.microsoft.com/en-us/library/ms740668.aspx If $hWs2_32 = -1 Then $hWs2_32 = DllOpen("Ws2_32.dll") Local $iRet = DllCall($hWs2_32, "int", "WSAGetLastError") If @error Then ;ConsoleWrite("+> _WSAGetLastError(): WSAGetLastError() failed. Script line number: " & @ScriptLineNumber & @CRLF) SetExtended(1) Return 0 EndIf Return $iRet[0] EndFunc ;==>_WSAGetLastError ;////////////////////////////////////////////////////////////// Edited September 24, 2011 by rover I see fascists...
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