Function Reference

TCPCloseSocket

TCPソケットを閉じます。

TCPCloseSocket ( socket )

 

パラメータ

socket TCPListenTCPAccept関数によって返される接続しているソケットの識別子(ソケットID)

 

返し値

成功 1を返します。
失敗 0を返し、@errorを設定します。
@error: WindowsAPIのWSAGetErrorの返し値 (MSDNを参照)。

 

注意

なし。

 

関連

TCPStartup, TCPListen, TCPAccept, TCPShutdown

 


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Opt('MustDeclareVars', 1)

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

; 接続を表す変数を初期化
;==============================================
Global $ConnectedSocket = -1

Global $MainSocket

Example()

Func Example()
    OnAutoItExitRegister("Cleanup")

    Local $g_IP, $RogueSocket, $GOOEY, $edit, $input, $butt, $msg
    Local $ret, $recv

    $g_IP = "127.0.0.1"

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

    ; リスニング用"ソケット"作成
    ;==============================================
    $MainSocket = TCPListen($g_IP, 65432, 100)
    If $MainSocket = -1 Then Exit
    $RogueSocket = -1

    ; チャット用GUIを作成
    ;==============================================
    $GOOEY = GUICreate("my server", 300, 200)
    $edit = GUICtrlCreateEdit("", 10, 40, 280, 150, $WS_DISABLED)
    $input = GUICtrlCreateInput("", 10, 10, 200, 20)
    $butt = GUICtrlCreateButton("Send", 210, 10, 80, 20, $BS_DEFPUSHBUTTON)
    GUISetState()


    ; GUIメッセージループ
    ;==============================================
    While 1
        $msg = GUIGetMsg()

        ; GUIを閉じる
        ;--------------------
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

        ; ユーザーがSENDを押した場合
        ;--------------------
        If $msg = $butt Then
            If $ConnectedSocket > -1 Then
                $ret = TCPSend($ConnectedSocket, GUICtrlRead($input))
                If @error Or $ret < 0 Then
                    ; エラー発生。ソケットを閉じ、ConnectedSocketを-1に再設定
                    ;----------------------------------------------------------------
                    TCPCloseSocket($ConnectedSocket)
                    WinSetTitle($GOOEY, "", "my server - Client Disconnected")
                    $ConnectedSocket = -1
                ElseIf $ret > 0 Then
                    ; 送信データでエディットコントロールを更新
                    ;----------------------------------------------------------------
                    GUICtrlSetData($edit, GUICtrlRead($edit) & GUICtrlRead($input) & @CRLF)
                EndIf
            EndIf
            GUICtrlSetData($input, "")
        EndIf

        If $RogueSocket > 0 Then
            $recv = TCPRecv($RogueSocket, 512)
            If Not @error Then
                TCPCloseSocket($RogueSocket)
                $RogueSocket = -1
            EndIf
        EndIf

        ; 接続していない場合、接続を探す
        ;--------------------
        If $ConnectedSocket = -1 Then
            $ConnectedSocket = TCPAccept($MainSocket)
            If $ConnectedSocket < 0 Then
                $ConnectedSocket = -1
            Else
                WinSetTitle($GOOEY, "", "my server - Client Connected")
            EndIf

            ; 接続している場合、データを読み取る
            ;--------------------
        Else
            ; 他のクライアントが接続を試みた場合、無条件で受け入れる
            ;----------------------------------------------------------------
            $RogueSocket = TCPAccept($MainSocket)
            If $RogueSocket > 0 Then
                TCPSend($RogueSocket, "~~rejected")
            EndIf

            $recv = TCPRecv($ConnectedSocket, 512)

            If $recv <> "" And $recv <> "~~bye"  Then
                ; 受信したデータでエディットコントロールを更新
                ;----------------------------------------------------------------
                GUICtrlSetData($edit, GUICtrlRead($edit) & ">" & $recv & @CRLF)

            ElseIf @error Or $recv = "~~bye"  Then
                ; エラー発生, ソケットを閉じてConnectedSocketを-1にリセット
                ;----------------------------------------------------------------
                WinSetTitle($GOOEY, "", "my server - Client Disconnected")
                TCPCloseSocket($ConnectedSocket)
                $ConnectedSocket = -1
            EndIf
        EndIf
    WEnd

    GUIDelete($GOOEY)
EndFunc   ;==>Example

Func Cleanup()
    ;スクリプト終了。開いているソケットを閉じ、TCPサービスをシャットダウン
    ;----------------------------------------------------------------------
    If $ConnectedSocket > -1 Then
        TCPSend($ConnectedSocket, "~~bye")
        Sleep(2000)
        TCPRecv($ConnectedSocket, 512)
        TCPCloseSocket($ConnectedSocket)
    EndIf
    TCPCloseSocket($MainSocket)
    TCPShutdown()
EndFunc   ;==>Cleanup