UDPRecv
Получает данные с открытого сокета.
UDPRecv ( socketarray, maxlen [, flag = 0 ] )
Параметры
socketarray | Сокет/массив возвращаемый функцией UDPBind. |
maxlen |
максимум # получаемых символов. |
flag |
[необязательный] Флаг 0 - (по умолчанию) автоматически определять бинарные или строка 1 - функция возвращает бинарные данные 2 - функция возвращает массив, включая IP и port. Массив следующего формата: [0] - данные [1] - IP [2] - Port Если хотите оба, просто используйте 3. |
Возвращаемое значение
Успех: | Возвращает бинарные данные или строку полученные с открытого сокета или массив, если flag = 2 или 3. |
Ошибка: | Возвращает пустую строку "" и устанавливает @error. |
@error: | -1, -2 или -3 не верный socketarray. |
Возвращает значения windows API WSAGetError (смотрите MSDN). |
Примечания
Для обратной совместимости по умолчанию эта функция будет пытаться возвращать строку. Если в данных возвращаются символы NULL (0x00), то возвращаемое значение будет бинарного типа.См. также
BinaryLen, BinaryMid, UDPOpen, UDPBind, UDPSendПример
#include <GUIConstantsEx.au3>
; Сначала нажмите "1. Запуск сервера", потом запустите копию этого скрипта нажмите "2. Запуск клиента".
Example()
Func Example()
UDPStartup() ; Запуск UDP служб.
; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
OnAutoItExitRegister("OnAutoItExit")
; Установка IP-адреса и порта
Local $sIPAddress = "127.0.0.1" ; Этот IP-адрес работает только для теста на вашем компьютере.
Local $iPort = 65432 ; Порт, используемый для соединения.
#region GUI
Local $hGUI = GUICreate("UDPRecv", 150, 85)
Local $iBtnServer = GUICtrlCreateButton("1. Запуск сервера", 10, 10, 130, 27)
Local $iBtnClient = GUICtrlCreateButton("2. Запуск клиента", 10, 45, 130, 27)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $iBtnServer
GUISetState(@SW_DISABLE, $hGUI)
_UDPRecv_Server($sIPAddress, $iPort)
GUISetState(@SW_ENABLE, $hGUI)
Case $iBtnClient
GUISetState(@SW_DISABLE, $hGUI)
_UDPRecv_Client($sIPAddress, $iPort)
GUISetState(@SW_ENABLE, $hGUI)
EndSwitch
Sleep(10)
WEnd
GUIDelete($hGUI)
#endregion GUI
EndFunc ;==>Example
Func _UDPRecv_Server($sIPAddress, $iPort)
; Создает сокет связанный с указанным IP-адресом и портом
Local $aSocket = UDPBind($sIPAddress, $iPort)
If @error Then ; Если ошибка, то выход
; Кто-то возможно уже связан с этим IP-адресом и портом (ещё одна копия скрипта уже выполняется?).
Local $iError = @error
MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось связать, @error = " & $iError)
Return False
EndIf
Local $sReceived
Do
; Ожидаем строку "tata" или "toto" (пример скрипта в UDPSend): 4 байта длиной.
$sReceived = UDPRecv($aSocket, 4)
Until $sReceived <> ""
; Примечания: Если вы не знаете, какой длины будут данные, то используйте, например 2048 в параметре maxlen и вызывайте функцию UDPRecv, пока не получите ничего или ошибку.
MsgBox(4096, "", "Сервер:" & @CRLF & "Получено: " & $sReceived)
UDPCloseSocket($aSocket) ; Закрывает сокет
EndFunc ;==>_UDPRecv_Server
Func _UDPRecv_Client($sIPAddress, $iPort)
; Подключает прослушивание сокета, указанного IP-адреса и порта.
Local $aSocket = UDPOpen($sIPAddress, $iPort)
Local $iError = 0
If @error Then ; Если ошибка, то выход
; Сервер, вероятно, в офлайне, или порт не открыт на сервере.
MsgBox(4096 + 16, "", "Клиент:" & @CRLF & "Не удалось подключиться, @error = " & @error)
Return False
EndIf
; Высылает строку "toto" серверу, преобразуя перед этим в бинарный тип.
UDPSend($aSocket, StringToBinary("toto"))
If @error Then ; Если ошибка, то выход
MsgBox(4096 + 16, "", "Клиент:" & @CRLF & "Не удалось выслать данные, @error = " & @error)
Return False
EndIf
UDPCloseSocket($aSocket) ; Закрывает сокет
EndFunc ;==>_UDPRecv_Client
Func OnAutoItExit()
UDPShutdown() ; Останавливает UDP службу.
EndFunc ;==>OnAutoItExit