Jump to content

Help [TCP] P2P Send Text/File


 Share

Recommended Posts

Use: 

 

Server Script:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <MsgBoxConstants.au3>
#include <ScrollBarsConstants.au3>
#include <WindowsConstants.au3>
#include "TCP.au3"

OnAutoItExitRegister("_OnExit")
Func _OnExit()
    TCPShutdown()
    Exit
EndFunc   ;==>_OnExit

#Region
Global $hGUI = GUICreate("TCP AutoIT Server", 620, 400, -1, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))

Global $sMode = GUICtrlCreateRadio("Server Mode", 16, 8, 97, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
Global $sGlobalIP = GUICtrlCreateInput("", 170, 8, 120, 21, $ES_READONLY)
Global $sServerIP = GUICtrlCreateInput(@IPAddress1, 300, 8, 120, 21, $ES_READONLY)
Global $sServerPORT = GUICtrlCreateInput("8888", 425, 8, 39, 21)
GUICtrlCreateLabel("IP Server:", 120, 10, 51, 17)
Global $bStartServer = GUICtrlCreateButton("Start Server", 512, 6, 89, 33)
Global $gMessenger = GUICtrlCreateGroup("Text to Send", 8, 64, 601, 129)
Global $tMessenger = GUICtrlCreateEdit("", 15, 85, 489, 97, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))

GUICtrlSetData(-1, "[START]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[END]")
Global $bSendMes = GUICtrlCreateButton("SEND", 511, 83, 89, 105)
GUICtrlCreateGroup("", -99, -99, 1, 1)

GUICtrlCreateLabel("File To Send:", 16, 200, 80, 17)
Global $sPathFileSend = GUICtrlCreateInput(@TempDir & "\XXX.jpg", 104, 200, 361, 21)
Global $bSelectFile = GUICtrlCreateButton(".!.", 472, 200, 35, 25)
GUICtrlCreateLabel("Path To Save:", 16, 230, 80, 17)
Global $sPathFileSave = GUICtrlCreateInput(@DesktopDir, 104, 230, 361, 21)
Global $bSelectDir = GUICtrlCreateButton("...", 472, 230, 35, 25)
Global $bSendFile = GUICtrlCreateButton("Send File", 512, 195, 89, 60)
;~ Global $tStatus = GUICtrlCreateLabel("", 16, 45, 580, 17)
Global $tStatus = GUICtrlCreateLabel("List Client:", 36, 45, 60, 17)
Global $listClient = GUICtrlCreateCombo("", 100, 45, 500, 17)

Global $gReceived = GUICtrlCreateGroup("Received", 8, 266, 601, 129)
Global $cDataReceived = GUICtrlCreateEdit("", 16, 282, 585, 105, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))

GUICtrlSetData(-1, "")
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

#EndRegion


Global $hClient, $xSocket, $xServerIP, $xServerPORT, $xPathFileSend, $xPathFileSave, $xGlobalIP = GetIP()
GUICtrlSetData($sGlobalIP, $xGlobalIP)
_WriteLog("Server IP WAN: " & $xGlobalIP)
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $bStartServer
            _WriteLog("SERVER: Starting up server...")
            $xServerIP = GUICtrlRead($sServerIP)
            $xServerPORT = GUICtrlRead($sServerPORT)
            _WriteLog("Server IP: " & $xServerIP)
            _WriteLog("Server Port: " & $xServerPORT)
            $hServer = _TCP_Server_Create($xServerPORT, "0.0.0.0")
            _TCP_RegisterEvent($hServer, $TCP_NEWCLIENT, "NewClient")
            _TCP_RegisterEvent($hServer, $TCP_DISCONNECT, "Disconnect")
            _TCP_RegisterEvent($hServer, $TCP_RECEIVE, "Recieved")

            _WriteLog( "SERVER: Started")
            GUICtrlSetData($bStartServer, "Running")
            GUICtrlSetState($bStartServer, $GUI_DISABLE)
        Case $bSendFile
            ConsoleWrite("Send File Pressed!" & @CRLF)

        Case $bSendMes
            Local $sClient = GUICtrlRead($listClient)
            $xMessenger = GUICtrlRead($tMessenger)
            _TCP_Send($sClient, $xMessenger)
            ConsoleWrite("Send Messenger Pressed!" & @CRLF)
        Case $bSelectFile

            $xPathFileSend = FileOpenDialog("Select file to send:", @DesktopDir, "All (*.*)", 3, "", $hGUI)
            If Not @error Then GUICtrlSetData($sPathFileSend, $xPathFileSend)
        Case $bSelectDir
            $xPathFileSave = FileSelectFolder("Select local to save file received:", @DesktopDir, 0, @ScriptDir, $hGUI)
            If Not @error Then GUICtrlSetData($sPathFileSave, $xPathFileSave)
    EndSwitch
    Sleep(1)
WEnd

Func NewClient($hSocket, $iError)
    GUICtrlSetData($listClient, $hSocket, $hSocket)
    _WriteLog("SERVER: New client connected/  Socket:" & $hSocket & "  /Sending this: Welcome!")
    _TCP_Send($hSocket, "Welcome!")
EndFunc   ;==>NewClient

Func Received($hSocket, $sReceived, $iError)
    _WriteLog("CLIENT: We received from Socket: " & $hSocket & " data: " & $sReceived)
EndFunc   ;==>Received


Func Disconnect($hSocket, $iError)
    _WriteLog("SERVER: Client disconnected. Socket:" & $hSocket)
EndFunc   ;==>Disconnect

Func _WriteLog($sLogMsg)
    Local $OldLog = GUICtrlRead($cDataReceived)
    GUICtrlSetData($cDataReceived, $OldLog & @CRLF & $sLogMsg)
;~  GUICtrlSetData($tStatus, $sLogMsg)
    ConsoleWrite("! " & $sLogMsg & @CRLF)
    $iEnd = StringLen(GUICtrlRead($tMessenger))
    _GUICtrlEdit_SetSel($tMessenger, $iEnd, $iEnd)
    _GUICtrlEdit_Scroll($tMessenger, $SB_SCROLLCARET)
    $iEnd = StringLen(GUICtrlRead($cDataReceived))
    _GUICtrlEdit_SetSel($cDataReceived, $iEnd, $iEnd)
    _GUICtrlEdit_Scroll($cDataReceived, $SB_SCROLLCARET)
EndFunc   ;==>_WriteLog

Func GetIP($i = "ip")
    Local $return, $IP = StringSplit(BinaryToString(InetRead("http://api.wipmania.com/")), "<br>", 1)
    If $i = "from" Then
        If Not $IP[1] = "" Then
            $return = $IP[2]
        Else
            Return "Error: Api not responding."
        EndIf
    Else
        If Not $IP[1] = "" Then
            $return = $IP[1]
        Else
            Return "Error: Api not responding."
        EndIf
    EndIf
    Return $return
EndFunc   ;==>GetIP

Client Script:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiStatusBar.au3>
#include <MsgBoxConstants.au3>
#include <ScrollBarsConstants.au3>
#include <WindowsConstants.au3>
#include "TCP.au3"

OnAutoItExitRegister("_OnExit")
Func _OnExit()
    TCPShutdown()
    Exit
EndFunc   ;==>_OnExit

#Region
Global $hGUI = GUICreate("TCP AutoIT Client", 620, 400, -1, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))


Global $sMode = GUICtrlCreateRadio("Client Mode", 16, 8, 97, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
Global $sConnectStatus = GUICtrlCreateLabel("", 408, 8, 89, 17)

Global $sServerIP = GUICtrlCreateInput(@IPAddress1, 224, 8, 120, 21)
Global $sServerPORT = GUICtrlCreateInput("8888", 345, 8, 39, 21)
GUICtrlCreateLabel("IP Server:", 160, 10, 51, 17)
Global $bStartConnect = GUICtrlCreateButton("Start Connect", 512, 6, 89, 33)
Global $gMessenger = GUICtrlCreateGroup("Text to Send", 8, 64, 601, 129)
Global $tMessenger = GUICtrlCreateEdit("", 15, 85, 489, 97, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))

GUICtrlSetData(-1, "[START]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[END]")
Global $bSendMes = GUICtrlCreateButton("SEND", 511, 83, 89, 105)
GUICtrlCreateGroup("", -99, -99, 1, 1)

GUICtrlCreateLabel("File To Send:", 16, 200, 80, 17)
Global $sPathFileSend = GUICtrlCreateInput(@TempDir & "\XXX.jpg", 104, 200, 361, 21)
Global $bSelectFile = GUICtrlCreateButton(".!.", 472, 200, 35, 25)
GUICtrlCreateLabel("Path To Save:", 16, 230, 80, 17)
Global $sPathFileSave = GUICtrlCreateInput(@DesktopDir, 104, 230, 361, 21)
Global $bSelectDir = GUICtrlCreateButton("...", 472, 230, 35, 25)
Global $bSendFile = GUICtrlCreateButton("Send File", 512, 195, 89, 60)
;~ Global $tStatus = GUICtrlCreateLabel("", 16, 45, 580, 17)

Global $gReceived = GUICtrlCreateGroup("Received", 8, 266, 601, 129)
Global $cDataReceived = GUICtrlCreateEdit("", 16, 282, 585, 105, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))

GUICtrlSetData(-1, "")
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

#EndRegion

Global $hClient, $xSocket, $xServerIP, $xServerPORT, $xPathFileSend, $xPathFileSave

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $bStartConnect

            $xServerIP = GUICtrlRead($sServerIP)
            $xServerPORT = GUICtrlRead($sServerPORT)
            _WriteLog("Server Port: " & $xServerIP)
            _WriteLog("Server Port: " & $xServerPORT)
            $hClient = _TCP_Client_Create($xServerIP, $xServerPORT) ; Create the client. Which will connect to the local ip address on port xxxx
            _TCP_RegisterEvent($hClient, $TCP_RECEIVE, "Received") ; Function "Received" will get called when something is received
            _TCP_RegisterEvent($hClient, $TCP_CONNECT, "Connected") ; And func "Connected" will get called when the client is connected.
            _TCP_RegisterEvent($hClient, $TCP_DISCONNECT, "Disconnected") ; And "Disconnected" will get called when the server disconnects us, or when the connection is lost.

            _WriteLog("CLIENT: Connecting...")
        Case $bSendFile
            ConsoleWrite("Send File Pressed!" & @CRLF)
;~          Exit
        Case $bSendMes
            $xMessenger = GUICtrlRead($tMessenger)
            _TCP_Send($xSocket, $xMessenger)
            ConsoleWrite("Send Messenger Pressed!" & @CRLF)
        Case $bSelectFile
            $xPathFileSend = FileOpenDialog("Select file to send:", @DesktopDir, "All (*.*)", 3, "", $hGUI)
            If Not @error Then GUICtrlSetData($sPathFileSend, $xPathFileSend)
        Case $bSelectDir
            $xPathFileSave = FileSelectFolder("Select local to save file received:", @DesktopDir, 0, @ScriptDir, $hGUI)
            If Not @error Then GUICtrlSetData($sPathFileSave, $xPathFileSave)
    EndSwitch
    Sleep(1)
WEnd

Func Connected($hSocket, $iError)
    If Not $iError Then
        _WriteLog("CLIENT: Connected!")
        GUICtrlSetData($bStartConnect, "Conneced")
        GUICtrlSetState($bStartConnect, $GUI_DISABLE)
        _WriteLog( "CLIENT: Conneced")
;~  _TCP_Send($hSocket, "Conneced :)")
;~  $xMessenger = GUICtrlRead($tMessenger)
;~  _TCP_Send($hSocket, $xMessenger)
;~  _WriteLog("CLIENT: Try reply socket: " & $hSocket & "  data: " & $xMessenger)
    Else
        _WriteLog("CLIENT: Could not connect. Are you sure the server is running?")
    EndIf
EndFunc   ;==>Connected

Func Received($hSocket, $sReceived, $iError)
    _WriteLog("CLIENT: We received from socket: " & $hSocket & "  data: " & $sReceived)
    Sleep(1000)
EndFunc   ;==>Received


Func Disconnect($hSocket, $iError)
    _WriteLog("SERVER: Client disconnected. Socket:" & $hSocket)
EndFunc   ;==>Disconnect

Func _WriteLog($sLogMsg)
    Local $OldLog = GUICtrlRead($cDataReceived)
    GUICtrlSetData($cDataReceived, $OldLog & @CRLF & $sLogMsg)
;~  GUICtrlSetData($tStatus, $sLogMsg)
    ConsoleWrite("! " & $sLogMsg & @CRLF)
    $iEnd = StringLen(GUICtrlRead($tMessenger))
    _GUICtrlEdit_SetSel($tMessenger, $iEnd, $iEnd)
    _GUICtrlEdit_Scroll($tMessenger, $SB_SCROLLCARET)
    $iEnd = StringLen(GUICtrlRead($cDataReceived))
    _GUICtrlEdit_SetSel($cDataReceived, $iEnd, $iEnd)
    _GUICtrlEdit_Scroll($cDataReceived, $SB_SCROLLCARET)
EndFunc   ;==>_WriteLog


Func GetIP($i = "ip")
    Local $return, $IP = StringSplit(BinaryToString(InetRead("http://api.wipmania.com/")), "<br>", 1)
    If $i = "from" Then
        If Not $IP[1] = "" Then
            $return = $IP[2]
        Else
            Return "Error: Api not responding."
        EndIf
    Else
        If Not $IP[1] = "" Then
            $return = $IP[1]
        Else
            Return "Error: Api not responding."
        EndIf
    EndIf
    Return $return
EndFunc   ;==>GetIP

TCP.au3

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Author:         Kip

 Script Function:
    TCP UDF v3

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#cs

Functions:

    _TCP_Server_Create($iPort, $sIP="0.0.0.0")
    _TCP_Server_Broadcast($sData)
    _TCP_Server_ClientList()
    _TCP_Server_ClientIP($hSocket)
    _TCP_Server_DisconnectClient($hSocket)
    _TCP_Server_Stop()


    _TCP_Client_Create($sIP , $iPort)
    _TCP_Client_Stop($hSocket)


    _TCP_Send($hSocket, $sText)
    _TCP_RegisterEvent($hSocket, $iEvent, $sFunction)


Register event values:

    $TCP_SEND               ; Function ($hSocket, $iError)
    $TCP_RECEIVE            ; Function ($hSocket, $sReceived, $iError)
    $TCP_CONNECT            ; Function ($hSocket, $iError)                  => Client only
    $TCP_DISCONNECT         ; Function ($hSocket, $iError)
    $TCP_NEWCLIENT          ; Function ($hSocket, $iError)                  => Server only


#ce


Global Const $FD_READ = 1
Global Const $FD_WRITE = 2
Global Const $FD_OOB = 4
Global Const $FD_ACCEPT = 8
Global Const $FD_CONNECT = 16
Global Const $FD_CLOSE = 32
Global $hWs2_32 = -1

Global Const $TCP_SEND = 1
Global Const $TCP_RECEIVE = 2
Global Const $TCP_CONNECT = 4
Global Const $TCP_DISCONNECT = 8
Global Const $TCP_NEWCLIENT = 16


TCPStartup()
Global Const $__TCP_WINDOW = GUICreate("Async Sockets UDF")
Global $__TCP_SOCKETS[1][7]






; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_Create
; Description ...: Initializes the server.
; Syntax.........: _TCP_Server_Create($iPort, $sIP="0.0.0.0")
; Parameters ....:  $iPort  - The port number the server should listen to.
;                   $sIP    - IP address. (Default = "0.0.0.0")
; Return values .: The socket handle.
; Author ........: Kip
; Modified.......:
; Remarks .......: Only 1 server can be created per script.
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_Create($iPort, $sIP="0.0.0.0")
    
    Local $hListenSocket = ___ASocket()
    
    
    ___ASockSelect( $hListenSocket, $__TCP_WINDOW, 0x0400, $FD_ACCEPT)
    GUIRegisterMsg( 0x0400, "___TCP_OnAccept" )
    
    
    ___ASockListen( $hListenSocket, $sIP, $iPort )
    
    $__TCP_SOCKETS[0][0] = $hListenSocket
    $__TCP_SOCKETS[0][1] = 0x0400
    
    Return $hListenSocket
    
EndFunc





Func ___TCP_OnAccept($hWnd, $iMsgID, $WParam, $LParam)
    
    Local $hSocket = $WParam
    Local $iError = ___HiWord( $LParam )
    Local $iEvent = ___LoWord( $LParam )
    
    Local $hClient, $uBound
    
    Abs($hWnd) ; Stupid AU3Check...
    
    If $iMsgID = $__TCP_SOCKETS[0][1] Then
        
        If $iEvent = $FD_ACCEPT Then
            
            If Not $iError Then
                
                ReDim $__TCP_SOCKETS[UBound($__TCP_SOCKETS)+1][7]
                $uBound = UBound($__TCP_SOCKETS)
                
                $hClient = TCPAccept($hSocket)
                
                ___ASockSelect($hClient, $__TCP_WINDOW, 0x0400 + $uBound - 1, BitOR($FD_READ, $FD_WRITE, $FD_CLOSE))
                GUIRegisterMsg(0x0400 + $uBound - 1, "___TCP_Server_OnSocketEvent" )
                
                $__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][0] = $hClient
                $__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][1] = 0x0400 + $uBound - 1
                
                Call($__TCP_SOCKETS[0][6], $hClient, $iError)
                
            Else
                
                Call($__TCP_SOCKETS[0][6], 0, $iError)
                
            EndIf
            
        ElseIf $iEvent = $FD_CONNECT Then
            
            Call($__TCP_SOCKETS[0][4], $hSocket, $iError)
            
        EndIf
        
    EndIf
    
    
EndFunc






; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Client_Stop
; Description ...: Stops the client.
; Syntax.........: _TCP_Client_Stop($hSocket)
; Parameters ....:  $hSocket    - Client socket.
; Return values .: Success  - True
;                  Failure  - False
; Author ........: Kip
; Modified.......:
; Remarks .......: The client socket is the return value of _TCP_Client_Create().
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Client_Stop($hSocket)
    
    Local $iElement, $i
    
    $iElement = 0
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        
        If $__TCP_SOCKETS[$i][0] = $hSocket Then
            $iElement = $i
            ExitLoop
        EndIf
        
    Next
    
    If $iElement Then
        
        ___ASockShutdown($__TCP_SOCKETS[$iElement][0])
        TCPCloseSocket($__TCP_SOCKETS[$iElement][0])
        
        ___ArrayDelete($__TCP_SOCKETS, $iElement)
        
        Return True
        
    EndIf
    
    Return False
    
EndFunc







; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_Stop
; Description ...: Stops the server, and closes all client connections.
; Syntax.........: _TCP_Server_Stop()
; Parameters ....: 
; Return values .: True
; Author ........: Kip
; Modified.......:
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_Stop()
    
    Local $i
    
    ___ASockShutdown($__TCP_SOCKETS[0][0])
    TCPCloseSocket($__TCP_SOCKETS[0][0])
    
    $__TCP_SOCKETS[0][0] = ""
    $__TCP_SOCKETS[0][1] = ""
    $__TCP_SOCKETS[0][2] = ""
    $__TCP_SOCKETS[0][3] = ""
    $__TCP_SOCKETS[0][4] = ""
    $__TCP_SOCKETS[0][5] = ""
    $__TCP_SOCKETS[0][6] = ""
    
    For $i = UBound($__TCP_SOCKETS)-1 to 1 Step -1
        ___ArrayDelete($__TCP_SOCKETS, $i)
    Next
    
    Return True
    
EndFunc






Func ___TCP_Server_OnSocketEvent( $hWnd, $iMsgID, $WParam, $LParam )
    
    Local $hSocket = $WParam
    Local $iError = ___HiWord( $LParam )
    Local $iEvent = ___LoWord( $LParam )
    
    Local $sDataBuff, $iElement, $i
    
    Abs($hWnd)
    
    $hSocket = 0
    $iElement = 0
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        
        If $__TCP_SOCKETS[$i][1] = $iMsgID Then
            $hSocket = $__TCP_SOCKETS[$i][0]
            $iElement = $i
            ExitLoop
        EndIf
        
    Next
    
    If $hSocket Then
        
        Switch $iEvent
            Case $FD_READ
                
                $sDataBuff = TCPRecv($hSocket, 1024)
                
                Call($__TCP_SOCKETS[0][2], $hSocket, $sDataBuff, $iError)
                
            Case $FD_WRITE
                
                Call($__TCP_SOCKETS[0][3], $hSocket, $iError)
                
            Case $FD_CLOSE
                
                ___ASockShutdown($hSocket)
                TCPCloseSocket($hSocket)
                
                Call($__TCP_SOCKETS[0][5], $hSocket, $iError)
                
                ___ArrayDelete($__TCP_SOCKETS, $iElement)
                
        EndSwitch
        
    EndIf
    
    
EndFunc






; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_DisconnectClient
; Description ...: Disconnects a client of the server.
; Syntax.........: _TCP_Server_DisconnectClient($hSocket)
; Parameters ....:  $hSocket    - Client socket.
; Return values .: Success  - True
;                  Failure  - False
; Author ........: Kip
; Modified.......:
; Remarks .......: The client socket is the $hSocket parameter of a _TCP_RegisterEvent callback function.
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_DisconnectClient($hSocket)
    
    Local $iElement, $i
    
    $iElement = 0
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        
        If $__TCP_SOCKETS[$i][0] = $hSocket Then
            $iElement = $i
            ExitLoop
        EndIf
        
    Next
    
    If $iElement Then
        
        ___ASockShutdown($hSocket)
        TCPCloseSocket($hSocket)
        
        ___ArrayDelete($__TCP_SOCKETS, $iElement)
        
        Return True
        
    EndIf
    
    Return False
    
EndFunc






; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_ClientList
; Description ...: Returns the sockets of all connected clients.
; Syntax.........: _TCP_Server_ClientList()
; Parameters ....:  
; Return values .: An 1 dimensional array of all connected clients.
; Author ........: Kip
; Modified.......:
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_ClientList()
    
    Local $aReturn[1], $i
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        If $__TCP_SOCKETS[$i][0] Then
            ReDim $aReturn[UBound($aReturn)+1]
            $aReturn[UBound($aReturn)-1] = $__TCP_SOCKETS[$i][0]
        EndIf
    Next
    
    $aReturn[0] = UBound($aReturn)-1
    
    Return $aReturn
    
EndFunc



; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_Broadcast
; Description ...: Sends data to all connected clients.
; Syntax.........: _TCP_Server_Broadcast($sData)
; Parameters ....:  $sData  - The data to send.
; Return values .: True
; Author ........: Kip
; Modified.......:
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_Broadcast($sData)
    
    Local $i
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        
        If $__TCP_SOCKETS[$i][0] Then TCPSend($__TCP_SOCKETS[$i][0], $sData)
        
    Next
    
    Return True
    
EndFunc





; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Client_Create
; Description ...: Creates a new client.
; Syntax.........: _TCP_Client_Create($sIP , $iPort)
; Parameters ....:  $sIP    - The IP address to connect to.
;                   $iPort  - Port on which the created socket will be connected.
; Return values .: Client socket handle.
; Author ........: Kip
; Modified.......:
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Client_Create($sIP , $iPort)
    
    ReDim $__TCP_SOCKETS[UBound($__TCP_SOCKETS)+1][7]
    
    local $hSocket = ___ASocket()
    
    $__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][0] = $hSocket
    $__TCP_SOCKETS[UBound($__TCP_SOCKETS)-1][1] = 0x0400 + (UBound($__TCP_SOCKETS)-1)
    
    ___ASockSelect( $hSocket, $__TCP_WINDOW, 0x0400 + (UBound($__TCP_SOCKETS)-1), BitOR( $FD_READ, $FD_WRITE, $FD_CONNECT, $FD_CLOSE ) )
    GUIRegisterMsg( 0x0400 + (UBound($__TCP_SOCKETS)-1), "___TCP_Client_OnSocketEvent" )
    ___ASockConnect( $hSocket, $sIP, $iPort )
    
    Return $hSocket
    
EndFunc





; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_RegisterEvent
; Description ...: Registers an event.
; Syntax.........: _TCP_RegisterEvent($hSocket, $iEvent, $sFunction)
; Parameters ....:  $hSocket    - Socket of the server or a client.
;                   $iEvent     - Event number. It can be any these values:
;                                   * $TCP_SEND
;                                   * $TCP_RECEIVE
;                                   * $TCP_CONNECT          => Client only
;                                   * $TCP_DISCONNECT
;                                   * $TCP_NEWCLIENT        => Server only
; Return values .: Success  - True
;                  Failure  - False
; Author ........: Kip
; Modified.......:
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_RegisterEvent($hSocket, $iEvent, $sFunction)
    
    Local $iSelected = 0
    Local $i
    
    If $__TCP_SOCKETS[0][0] Then
        
        $iSelected = 0
        
    Else
        
        For $i = 0 to UBound($__TCP_SOCKETS)-1
            If $__TCP_SOCKETS[$i][0] = $hSocket Then
                $iSelected = $i
                ExitLoop
            EndIf
        Next
        
        If Not $iSelected Then Return 0
        
    EndIf
    
    Switch $iEvent
        Case $TCP_SEND
            $__TCP_SOCKETS[$iSelected][3] = $sFunction
        Case $TCP_RECEIVE
            $__TCP_SOCKETS[$iSelected][2] = $sFunction
        Case $TCP_CONNECT
            $__TCP_SOCKETS[$iSelected][4] = $sFunction
        Case $TCP_DISCONNECT
            $__TCP_SOCKETS[$iSelected][5] = $sFunction
        Case $TCP_NEWCLIENT
            $__TCP_SOCKETS[$iSelected][6] = $sFunction
        Case Else
            Return False
    EndSwitch
    
    Return True

    
EndFunc




; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Server_ClientIP
; Description ...: Converts a client socket handle to IP address.
; Syntax.........: _TCP_Server_ClientIP($hSocket)
; Parameters ....:  $hSocket    - Client socket handle.
; Return values .: A string with the IP address.
; Author ........: Unknown
; Modified.......: Kip
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Server_ClientIP($hSocket)
    
    Local $pSocketAddress, $aReturn
    
    $pSocketAddress = DllStructCreate("short;ushort;uint;char[8]")
    $aReturn = DllCall("Ws2_32.dll", "int", "getpeername", "int", $hSocket, "ptr", DllStructGetPtr($pSocketAddress), "int*", DllStructGetSize($pSocketAddress))
    If @error Or $aReturn[0] <> 0 Then Return 0
    
    $aReturn = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($pSocketAddress, 3))
    If @error Then Return 0
    
    $pSocketAddress = 0
    
    Return $aReturn[0]
    
EndFunc





; #FUNCTION# ;===============================================================================
;
; Name...........: _TCP_Send
; Description ...: Sends data to a server or client.
; Syntax.........: _TCP_Send($hSocket, $sText)
; Parameters ....:  $hSocket    - Client or server socket handle.
;                   $sText      - Data to send.
; Return values .: 
; Author ........: Kip
; Modified.......: 
; Remarks .......: 
; Related .......: 
; Link ..........;
; Example .......; 
;
; ;==========================================================================================

Func _TCP_Send($hSocket, $sText)
    
    Return TCPSend($hSocket, $sText)
    
EndFunc



Func ___TCP_Client_OnSocketEvent( $hWnd, $iMsgID, $WParam, $LParam )
    
    Local $iError = ___HiWord( $LParam )
    Local $iEvent = ___LoWord( $LParam )
    
    Local $hSocket, $iElement, $i, $sDataBuff
    
    Abs($hWnd)
    Abs($WParam)
    
    $hSocket = 0
    $iElement = 0
    
    For $i = 1 to UBound($__TCP_SOCKETS)-1
        
        If $__TCP_SOCKETS[$i][1] = $iMsgID Then
            $hSocket = $__TCP_SOCKETS[$i][0]
            $iElement = $i
            ExitLoop
        EndIf
        
    Next
    
    If $hSocket Then
        
        Switch $iEvent
            Case $FD_READ; Data has arrived!
                
                $sDataBuff = TCPRecv( $hSocket, 1024)
                
                Call($__TCP_SOCKETS[$i][2], $hSocket, $sDataBuff, $iError)
                
                $sDataBuff = ""
                
            Case $FD_WRITE
                
                Call($__TCP_SOCKETS[$i][3], $hSocket, $iError)
                
            Case $FD_CONNECT
                
                Call($__TCP_SOCKETS[$i][4], $hSocket, $iError)
                
            Case $FD_CLOSE
                
                ___ASockShutdown( $hSocket )
                TCPCloseSocket( $hSocket )
                
                Call($__TCP_SOCKETS[$i][5], $hSocket, $iError)
                
                ___ArrayDelete($__TCP_SOCKETS, $iElement)
                
        EndSwitch
        
    EndIf
    
EndFunc



;==================================================================================================================
; 
; Zatorg's Asynchronous Sockets UDF Starts from here.
; 
;==================================================================================================================


Func ___ASocket($iAddressFamily = 2, $iType = 1, $iProtocol = 6)
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    Local $hSocket = DllCall($hWs2_32, "uint", "socket", "int", $iAddressFamily, "int", $iType, "int", $iProtocol)
    If @error Then
        SetError(1, @error)
        Return -1
    EndIf
    If $hSocket[ 0 ] = -1 Then
        SetError(2, ___WSAGetLastError())
        Return -1
    EndIf
    Return $hSocket[ 0 ]
EndFunc   ;==>_ASocket

Func ___ASockShutdown($hSocket)
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    Local $iRet = DllCall($hWs2_32, "int", "shutdown", "uint", $hSocket, "int", 2)
    If @error Then
        SetError(1, @error)
        Return False
    EndIf
    If $iRet[ 0 ] <> 0 Then
        SetError(2, ___WSAGetLastError())
        Return False
    EndIf
    Return True
EndFunc   ;==>_ASockShutdown

Func ___ASockClose($hSocket)
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    Local $iRet = DllCall($hWs2_32, "int", "closesocket", "uint", $hSocket)
    If @error Then
        SetError(1, @error)
        Return False
    EndIf
    If $iRet[ 0 ] <> 0 Then
        SetError(2, ___WSAGetLastError())
        Return False
    EndIf
    Return True
EndFunc   ;==>_ASockClose

Func ___ASockSelect($hSocket, $hWnd, $uiMsg, $iEvent)
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    Local $iRet = DllCall( _
            $hWs2_32, _
            "int", "WSAAsyncSelect", _
            "uint", $hSocket, _
            "hwnd", $hWnd, _
            "uint", $uiMsg, _
            "int", $iEvent _
            )
    If @error Then
        SetError(1, @error)
        Return False
    EndIf
    If $iRet[ 0 ] <> 0 Then
        SetError(2, ___WSAGetLastError())
        Return False
    EndIf
    Return True
EndFunc   ;==>_ASockSelect

; Note: you can see that $iMaxPending is set to 5 by default.
; IT DOES NOT MEAN THAT DEFAULT = 5 PENDING CONNECTIONS
; 5 == SOMAXCONN, so don't worry be happy
Func ___ASockListen($hSocket, $sIP, $uiPort, $iMaxPending = 5); 5 == SOMAXCONN => No need to change it.
    Local $iRet
    Local $stAddress

    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )

    $stAddress = ___SockAddr($sIP, $uiPort)
    If @error Then
        SetError(@error, @extended)
        Return False
    EndIf
    
    $iRet = DllCall($hWs2_32, "int", "bind", "uint", $hSocket, "ptr", DllStructGetPtr($stAddress), "int", DllStructGetSize($stAddress))
    If @error Then
        SetError(3, @error)
        Return False
    EndIf
    If $iRet[ 0 ] <> 0 Then
        $stAddress = 0; Deallocate
        SetError(4, ___WSAGetLastError())
        Return False
    EndIf
    
    $iRet = DllCall($hWs2_32, "int", "listen", "uint", $hSocket, "int", $iMaxPending)
    If @error Then
        SetError(5, @error)
        Return False
    EndIf
    If $iRet[ 0 ] <> 0 Then
        $stAddress = 0; Deallocate
        SetError(6, ___WSAGetLastError())
        Return False
    EndIf
    
    Return True
EndFunc   ;==>_ASockListen

Func ___ASockConnect($hSocket, $sIP, $uiPort)
    Local $iRet
    Local $stAddress
    
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    
    $stAddress = ___SockAddr($sIP, $uiPort)
    If @error Then
        SetError(@error, @extended)
        Return False
    EndIf
    
    $iRet = DllCall($hWs2_32, "int", "connect", "uint", $hSocket, "ptr", DllStructGetPtr($stAddress), "int", DllStructGetSize($stAddress))
    If @error Then
        SetError(3, @error)
        Return False
    EndIf
    
    $iRet = ___WSAGetLastError()
    If $iRet = 10035 Then; WSAEWOULDBLOCK
        Return True; Asynchronous connect attempt has been started.
    EndIf
    SetExtended(1); Connected immediately
    Return True
EndFunc   ;==>_ASockConnect

; A wrapper function to ease all the pain in creating and filling the sockaddr struct
Func ___SockAddr($sIP, $iPort, $iAddressFamily = 2)
    Local $iRet
    Local $stAddress
    
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    
    $stAddress = DllStructCreate("short; ushort; uint; char[8]")
    If @error Then
        SetError(1, @error)
        Return False
    EndIf
    
    DllStructSetData($stAddress, 1, $iAddressFamily)
    $iRet = DllCall($hWs2_32, "ushort", "htons", "ushort", $iPort)
    DllStructSetData($stAddress, 2, $iRet[ 0 ])
    $iRet = DllCall($hWs2_32, "uint", "inet_addr", "str", $sIP)
    If $iRet[ 0 ] = 0xffffffff Then; INADDR_NONE
        $stAddress = 0; Deallocate
        SetError(2, ___WSAGetLastError())
        Return False
    EndIf
    DllStructSetData($stAddress, 3, $iRet[ 0 ])
    
    Return $stAddress
EndFunc   ;==>__SockAddr

Func ___WSAGetLastError()
    If $hWs2_32 = -1 Then $hWs2_32 = DllOpen( "Ws2_32.dll" )
    Local $iRet = DllCall($hWs2_32, "int", "WSAGetLastError")
    If @error Then
        ;ConsoleWrite("+> _WSAGetLastError(): WSAGetLastError() failed. Script line number: " & @ScriptLineNumber & @CRLF)
        SetExtended(1)
        Return 0
    EndIf
    Return $iRet[ 0 ]
EndFunc   ;==>_WSAGetLastError


; Got these here:
; http://www.autoitscript.com/forum/index.php?showtopic=5620&hl=MAKELONG
Func ___MakeLong($LoWord, $HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF)); Thanks Larry
EndFunc   ;==>_MakeLong

Func ___HiWord($Long)
    Return BitShift($Long, 16); Thanks Valik
EndFunc   ;==>_HiWord

Func ___LoWord($Long)
    Return BitAND($Long, 0xFFFF); Thanks Valik
EndFunc   ;==>_LoWord


; ========================================= Array functions

; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayDelete
; Description ...: Deletes the specified element from the given array.
; Syntax.........: _ArrayDelete(ByRef $avArray, $iElement)
; Parameters ....: $avArray  - Array to modify
;                  $iElement - Element to delete
; Return values .: Success - New size of the array
;                  Failure - 0, sets @error to:
;                  |1 - $avArray is not an array
;                  |3 - $avArray has too many dimensions (only up to 2D supported)
;                  |(2 - Deprecated error code)
; Author ........: Cephas <cephas at clergy dot net>
; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - array passed ByRef, Ultima - 2D arrays supported, reworked function (no longer needs temporary array; faster when deleting from end)
; Remarks .......: If the array has one element left (or one row for 2D arrays), it will be set to "" after _ArrayDelete() is used on it.
; Related .......: _ArrayAdd, _ArrayInsert, _ArrayPop, _ArrayPush
; Link ..........;
; Example .......; Yes
; ===============================================================================================================================
Func ___ArrayDelete(ByRef $avArray, $iElement)
    If Not IsArray($avArray) Then Return SetError(1, 0, 0)

    Local $iUBound = UBound($avArray, 1) - 1

    If Not $iUBound Then
        $avArray = ""
        Return 0
    EndIf

    ; Bounds checking
    If $iElement < 0 Then $iElement = 0
    If $iElement > $iUBound Then $iElement = $iUBound

    ; Move items after $iElement up by 1
    Switch UBound($avArray, 0)
        Case 1
            For $i = $iElement To $iUBound - 1
                $avArray[$i] = $avArray[$i + 1]
            Next
            ReDim $avArray[$iUBound]
        Case 2
            Local $iSubMax = UBound($avArray, 2) - 1
            For $i = $iElement To $iUBound - 1
                For $j = 0 To $iSubMax
                    $avArray[$i][$j] = $avArray[$i + 1][$j]
                Next
            Next
            ReDim $avArray[$iUBound][$iSubMax + 1]
        Case Else
            Return SetError(3, 0, 0)
    EndSwitch

    Return $iUBound
EndFunc   ;==>_ArrayDelete

 

Problem:
- Can not send and receive between Client and Server!
- Data loss, data reception is not complete.

Edited by You

Regards,
 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...