函数参考


TCPRecv

从已经连接的套接字里面接收数据.

TCPRecv ( 主套接字, 最大返回量[, 标志])

参数

主套接字 套接字标识(SocketID),参见 a TCPAccept 或者 TCPConnect 函数.
最大返回量 定义返回是接收的最大字符数.
标志 [可选参数] 强制函数返回二进制数据需要设置为1(默认为 0, 并且不会自动进行检测二进制/字符串数据).

返回值

成功: 返回二进制/字符串的值(从已经连接的套接字里面接收).
失败: 返回空字符串 "" 并设置 @error 的值
@error: -1 套接字错误
Windows API WSAGetError 返回值(参考 MSDN).

注意/说明

由于向后兼容的原因,函数将试着返回一个字符串. 默认情况下.如果是空字符(0x00)返回,返回值将是二进制类型.
要强制函数总是返回二进位的数据(最好的选择),需要将参数 "标志" 设置为 1.
如果要传输一个 Unicode 字符串,请使用 StringToBinary()/BinaryToString() 进行编码解码.

相关

TCPSend, BinaryLen, BinaryMid, TCPStartup, TCPAccept, TCPConnect, TCPTimeout (Option), BinaryToString

示例/演示


#include <GUIConstantsEx.au3>

;==============================================
;==============================================
;服务端! 服务端启用后,再启用客户端(服务端为接收信息方)
;==============================================
;==============================================

Example()

Func Example()
    ; 设置一些常用信息
    ; 在这里设置你的公共IP地址 (@IPAddress1).
    ;   Local $szServerPC = @ComputerName
    ;   Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1;你的公共IP地址
    Local $nPORT = 33891;端口
    Local $MainSocket, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    ; 开始 TCP 服务
    ;==============================================
    TCPStartup()

    ; 创建一个监听 "SOCKET".
    ;   使用您的IP地址和端口33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

    ; 如果套接字创建失败,退出.
    If $MainSocket = -1 Then Exit


    ; 创建一个图形用户界面消息窗
    ;==============================================
    GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200, 100, 100)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
    GUISetState()


    ; 初始化一个变量描述连接
    ;==============================================
    $ConnectedSocket = -1


    ;等待和接受连接
    ;==============================================
    Do
        $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1


    ; 取得连接的客户端的IP
    $szIP_Accepted = SocketToIP($ConnectedSocket)

    ; 循环图形用户界面消息
    ;==============================================
    While 1
        $msg = GUIGetMsg()

        ; 关闭图形用户界面
        ;--------------------
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

        ; 尝试接收(最高)2048字节
        ;----------------------------------------------------------------
        $recv = TCPRecv($ConnectedSocket, 2048)

        ; 如果接收失败(@error)将断开连接   
        ;----------------------------------------------------------------
        If @error Then ExitLoop

        ; convert from UTF-8 to AutoIt native UTF-16
        $recv = BinaryToString($recv, 4)

        ; Update the edit control with what we have received
        ;----------------------------------------------------------------
        If $recv <> "" Then GUICtrlSetData($edit, _
                $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    WEnd


    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

    TCPShutdown()
EndFunc   ;==>Example

; 函数返回一个连接的套接字的IP地址.
;----------------------------------------------------------------------
Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc   ;==>SocketToIP