#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