接続しているソケットからデータを受信します。
TCPRecv ( mainsocket, maxlen [, flag] )
パラメータ
mainsocket | TCPAccept、TCPConnect関数によって返される接続しているソケットの識別子(ソケットID) |
maxlen | 受信する最大文字数 |
flag | [オプション] 1に設定した場合、関数はバイナリデータを返します(デフォルトは0でバイナリ/文字列を自動検知します)。 |
返し値
成功 | 接続しているソケットから送信されたバイナリ/文字列を返します。 |
失敗 | ""を返し、@errorを設定します。 |
@error: | -1 : ソケットエラー |
WindowsAPIのWSAGetErrorの返し値 (MSDNを参照)。 |
注意
後方互換性のためにこの関数はデフォルトでは文字列を返そうとします。 NULL文字(0x00)を受信した場合、返し値はバイナリ型になります。
関連
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