Page 1 sur 1
[R] Provenance des paquets UDP
Posté : mer. 15 juil. 2009 02:55
par Iste
Salutations,
Ma question est simple, peut on connaitre l'adresse IP d'ou arrivent les données avec les fonction UDP d'autoit ?
Mieux, peut-on trier les paquet reçu au lieux de tout coller ensemble ?
Wala, merci
Re: [..] Provenance des paquets UDP
Posté : jeu. 16 juil. 2009 18:04
par orax
Pour récupérer l'adresse IP j'ai trouvé la fonction "recvfrom" sur MSDN :
http://msdn.microsoft.com/en-us/library ... S.85).aspx. J'ai essayé de l'implanter dans un script...
► Afficher le texte
Code : Tout sélectionner
UDPStartup()
; Bind to a SOCKET
;==============================================
$socket = UDPBind("192.168.0.20", 14477)
If @error <> 0 Then Exit
While 1
;~ $data = UDPRecv($socket, 50)
$data = recvfrom($socket, 50)
If $data <> "" Then
MsgBox(0, "UDP DATA ","...", 5)
EndIf
Sleep(500)
WEnd
Func OnAutoItExit()
UDPCloseSocket($socket)
UDPShutdown()
EndFunc ;==>OnAutoItExit
;~ http://msdn.microsoft.com/en-us/library/ms740120(VS.85).aspx
Func recvfrom($socket, $tailleBuf, $flags = 0, $from = "", $fromlen = "")
Local $buf = DllStructCreate("char[" & $tailleBuf & "] buf;")
Local $pBuf = DllStructGetPtr($buf)
Local $len = $tailleBuf
Local $ret = DllCall("Ws2_32.dll", "int", "recvfrom", _
"int", $socket, _
"str*", $pBuf, _
"int", $len, _
"int", $flags, _
"ptr", $from, _
"int*", $fromlen)
; codes d'erreur :
; http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx
$ret = DllCall("Ws2_32.dll", "int", "WSAGetLastError")
ConsoleWrite($ret[0] & " ")
$buf = DllStructCreate("char[" & $tailleBuf & "] buf;", $pBuf)
Return DllStructGetData($buf, "buf")
EndFunc ;==>recvfrom
... mais ça ne marche pas !

Re: [..] Provenance des paquets UDP
Posté : jeu. 16 juil. 2009 20:45
par Iste

Ben je crois que je vais finir par laisser tomber l'UDP pour le TCP, alors qu'a la base je l'avais pris pour que ca soit plus facile

Re: [..] Provenance des paquets UDP
Posté : ven. 17 juil. 2009 01:44
par orax
J'ai pu rendre le code fonctionnel. La fonction retourne l'IP et les données reçues.
Peut-être que vous avez déjà laissé tombé pour le TCP mais bon, si ça peut servir à quelqu'un d'autre, je le mets quand même.
► Afficher le texte
Code : Tout sélectionner
UDPStartup()
Global $d
Global $s = UDPBind("192.168.0.1", 12345)
If @error <> 0 Then Exit
While 1
$d = recvfrom($s[1], 256)
If $d[0] <> "" Then
MsgBox(0, $d[1], $d[0], 1)
EndIf
Sleep(500)
WEnd
; retourne
; 0 : données
; 1 : adresse IP
Func recvfrom($socket, $tailleBuf, $flags = "")
Local $r[2]
Local $buf = DllStructCreate("char[" & $tailleBuf & "]")
Local $pBuf = DllStructGetPtr($buf)
Local $len = $tailleBuf
Local $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
Local $from = DllStructGetPtr($sockaddr)
Local $ret = DllCall("Ws2_32.dll", "int", "recvfrom", _
"int", $socket, _
"ptr", $pBuf, _
"int", $len, _
"int", $flags, _
"ptr", $from, _
"int*", DllStructGetSize($sockaddr))
; codes d'erreur :
; http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx
$ret = DllCall("Ws2_32.dll", "int", "WSAGetLastError")
If $ret[0] <> 0 Then Return SetError(1, $ret[0], $r)
$r[0] = DllStructGetData($buf, 1) ; données
$ret = DllCall("Ws2_32.dll", "str", "inet_ntoa", _
"int", DllStructGetData($sockaddr, 3))
$r[1] = $ret[0] ; adresse IP
Return $r
EndFunc ;==>recvfrom
Func OnAutoItExit()
UDPCloseSocket($s)
UDPShutdown()
EndFunc ;==>OnAutoItExit
Re: [..] Provenance des paquets UDP
Posté : ven. 17 juil. 2009 02:35
par Iste
Héhé non je n'avais pas encore résolu mon probleme ^^
Aussi je suis bien content de voir que tu t'en es sorti !
Merci beaucoup
Je m'en vais faire mes test de ce pas
Edit : ca fonctionne bien ^^ mais, a quoi sert le flag ?