Function Reference

TCPRecv

接続しているソケットからデータを受信します。

TCPRecv ( mainsocket, maxlen [, flag] )

 

パラメータ

mainsocket TCPAcceptTCPConnect関数によって返される接続しているソケットの識別子(ソケットID)
maxlen 受信する最大文字数
flag [オプション] 1に設定した場合、関数はバイナリデータを返します(デフォルトは0でバイナリ/文字列を自動検知します)。

 

返し値

成功 接続しているソケットから送信されたバイナリ/文字列を返します。
失敗 ""を返し、@errorを設定します。
@error: -1 : ソケットエラー
WindowsAPIのWSAGetErrorの返し値 (MSDNを参照)。

 

注意

後方互換性のためにこの関数はデフォルトでは文字列を返そうとします。 NULL文字(0x00)を受信した場合、返し値はバイナリ型になります。
関数が常にバイナリデータを返すようにするには"flag"パラメータを1に設定してください(もっとも賢明な方法です)。

 

関連

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

 


#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

;==============================================
;==============================================
;サーバー!! 最初に実行!!!!!!!!!!!!!!!
;==============================================
;==============================================

Example()

Func Example()
    ; 利用する情報を設定
    ; パブリックIPアドレス(@IPAddress1)をここで設定
;   Local $szServerPC = @ComputerName
;   Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    ; TCPサービスを開始
    ;==============================================
    TCPStartup()

    ; リスニング用"ソケット"作成
    ;   ; IPアドレスとポート33891を使用
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

    ; ソケット作成に失敗したら終了
    If $MainSocket = -1 Then Exit


    ; メッセージ用GUI作成
    ;==============================================
    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200)
    $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

        ; 最大2048byteまでの受信を試みる
        ;----------------------------------------------------------------
        $recv = TCPRecv($ConnectedSocket, 2048)

        ; @errorが"失敗"の場合、ソケットは接続していない
        ;----------------------------------------------------------------
        If @error Then ExitLoop

        ; 受信情報を元にエディットコントロールを更新
        ;----------------------------------------------------------------
        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