Функция TCPRecv

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


TCPRecv

Получает данные с подключенного сокета.

TCPRecv ( mainsocket, maxlen [, flag = 0 ] )

Параметры

mainsocket Идентификатор подключенного сокета (SocketID) возвращаемый функцией TCPAccept или TCPConnect.
maxlen максимум # получаемых символов.
flag [необязательный] Флаг
0 - (по умолчанию) автоматически определять бинарные или строка
1 - принудительно возвращает бинарные данные

Возвращаемое значение

Успех:Возвращает бинарные данные или строку полученные с подключенного сокета.
Ошибка:Возвращает пустую строку "" и устанавливает @error
@error:-1 Ошибка сокета
Возвращает значения windows API WSAGetError (смотрите MSDN).

Примечания

Для обратной совместимости по умолчанию эта функция будет пытаться возвращать строку. Если в данных возвращаются символы NULL (0x00), то возвращаемое значение будет бинарного типа.
Чтобы заставить функцию всегда возвращать бинарные данные (что является наиболее разумным вариантом), используйте параметр flag установленный в 1.
Если строки Юникода необходимо для передачи, они должны кодироваться/декодироваться с помощью StringToBinary()/BinaryToString().

См. также

TCPSend, BinaryLen, BinaryMid, TCPStartup, TCPAccept, TCPConnect, TCPTimeout (Опция), BinaryToString

Пример

#include <GUIConstantsEx.au3>

; Этот скрипт - сервер. Запустите это скрипт первым, перед тем как запустить скрипт клиента из примера функции TCPSend

Example()

Func Example()
    ; Устанавливает IP-адрес (@IPAddress1).
    ;   Local $szServerPC = @ComputerName
    ;   Local $sIPAddress = TCPNameToIP($szServerPC)
    Local $sIPAddress = @IPAddress1
    Local $iPort = 33891
    Local $iListenSocket, $iEdit, $iSocket, $szIP_Accepted
    Local $msg, $sData

    TCPStartup() ; Запуск TCP служб.

    ; Регистрация функции OnAutoItExit для остановки служб при завершении скрипта.
    OnAutoItExitRegister("OnAutoItExit")

    ; Создает сокет связанный с указанным IP-адресом и портом
    $iListenSocket = TCPListen($sIPAddress, $iPort)

    ; Если не удалось создать сокет, то выход
    If @error Then Return MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось прослушать сокет, @error = " & @error)

    ; Создает GUI для вывода сообщений
    $hGui = GUICreate("Сервер (" & $sIPAddress & ")", 300, 200, 100, 100)
    $iEdit = GUICtrlCreateEdit("", 10, 10, 280, 180)
    GUISetState()

    ; Ожидание и приём соединения
    Do
        $iSocket = TCPAccept($iListenSocket)
        If @error Then Return MsgBox(4096 + 16, "", "Сервер:" & @CRLF & "Не удалось принять входящее соединение, @error = " & @error, 0, $hGui)
    Until $iSocket <> -1

    ; Получает IP подключившегося клиента
    $szIP_Accepted = SocketToIP($iSocket)

    While 1 ; Цикл сообщений GUI
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop

        ; Попытка получить (до) 2048 байт
        $sData = TCPRecv($iSocket, 2048)

        ; Если возвращает ошибку @error, это означает, что сокет отключен. Соответственно выход из цикла.
        If @error Then ExitLoop

        ; Конвертирует бинарные данные из UTF-8 в нативный UTF-16
        $sData = BinaryToString($sData, 4)

        ; Обновляет окно приёма сообщений полученными данными
        If $sData Then GUICtrlSetData($iEdit, _
                $szIP_Accepted & " > " & $sData & @CRLF & GUICtrlRead($iEdit))
    WEnd

    If $iSocket <> -1 Then TCPCloseSocket($iSocket)
EndFunc   ;==>Example

; Функция возвращает IP-адрес подключенного сокета.
Func SocketToIP($iSocket)
    Local $tSockAddr, $aRet
    $tSockAddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $iSocket, "ptr", DllStructGetPtr($tSockAddr), "int*", DllStructGetSize($tSockAddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSockAddr, 3))
        If Not @error Then Return $aRet[0]
    EndIf
    Return 0
EndFunc   ;==>SocketToIP

Func OnAutoItExit()
    TCPShutdown() ; Останавливает TCP службу.
EndFunc   ;==>OnAutoItExit