Функция UDPRecv

         Описание функции


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), то возвращаемое значение будет бинарного типа.
Чтобы заставить функцию всегда возвращать бинарные данные (что является наиболее разумным вариантом), используйте параметр flag равным 1.

См. также

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