基 础 函 数 参 考


TCPRecv

接收套接字(socket)连接的数据.

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

参 数

主套接字 TCPAccept or a TCPConnect 函数返回的套接字标识符.
最大返回量 max # 最大接收字符数.
标志 [可选参数] 设置为 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
    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


    ; 创建消息 GUI
    ;==============================================
    GUICreate("我的服务器 (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)

    ; GUI 消息循环
    ;==============================================
    While 1
        $msg = GUIGetMsg()

        ; GUI 关闭
        ;--------------------
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

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

        ; 如果收到失败 @error, 则断开套接字 "socket"
        ;----------------------------------------------------------------
        If @error Then ExitLoop

        ; 转换 UTF-8 到 AutoIt 原 UTF-16
        $recv = BinaryToString($recv, 4)

        ; 用我们接收的数据更新编辑控件
        ;----------------------------------------------------------------
        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

provider with jb51.net (unicode)