Sign in to follow this  
Followers 0
Kneel

Packet-based TCP comms Helper

1 post in this topic

If you are talking using text based protocols, Kip's TCP.au3 event driven UDF is great. But what happens if you want to talk to a 3rd party providers device/software that talks using binary format data in packet form? What if the packet size is variable? PTCP is a wrapper around Kip's TCP.au3 that lets you focus on dealing with the packets, rather than figuring out how to determine if there is a complete packet available etc.
 For sending, you just send a binary string (the actual packet data)

 For receiving, you just get a complete packet - even if the packet size is variable!

How? When you connect, you pass an AutoIt expression that tells PTCP how to tell if a packet is complete. For fixed sized packets, that's easy - just pass the number of bytes. For variable length packets, the expression can contain references to the packet data itself, as well as the number of bytes currently in the Rx buffer. This means you can specify the packet size as some combination of bytes in the packet.

An example might be: "($iAvail>7)?((BitAND(BinaryMid($aPacket,7,1), '0xff'))+(BitShift(BitAND(BinaryMid($aPacket,8,1),'0xff'),-8))+8):(0)"

This says: we need at least 8 bytes of the packet to know the packet size; once we have these 8 bytes, the packet size is stored in bytes 7 & 8 as little-endian (LSB first)

Other than the packetizing details, it's pretty much just Kip's event driven TCP code.

Hope you find it useful.

PTCP.au3

Share this post


Link to post
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
Sign in to follow this  
Followers 0

  • Similar Content

    • You
      By You
      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]kYtkjq1VuPTdNQtNlLuzUcEA56F4AaxlrhPZ3FSMd9Svss6Fflt0au6GMqMukNudNX02q7VqFVqJaaD0m5GG7hkGhg6TvblZDCZJ2YZNS1lj4t0hSmBly0nMBQYPDc3XTCUD3o4hZnROywXgaw713XHEeiuiXvu6UVXkVvlSdSlox8OkgEu0pk9zKYQJM0nfiiEaCbo4Rp6qKdDsVCtuDgQSmgsXbI5ZIV2kq59AGkX52Zy6OvH2gRuMZeW3ub0aFr9r2c2XpcNOc1FPWcMfHsk77fk8GkYrtLTAYhFt2kzKLS0KKUiVaymVXMcgGhIpeAGfGLt9RSnfgBFMxUzLWMr031ts48toWug85ktsJmdfN9uqHUNGkIEY2pOFNN88PuAqqmoaSit3TvHZgyai7v1XubxaS4G2pK5hB2uhC0rljehCjMo5TRNiOdXvrLELgTT2ema8FbPZoNT4Vs3nb6dYTok7wloUbpK6ggWkHfjG6sAQJItNYPhRdVcB2YqnBbT8hreFoQXy2YAtbtLmRWTbNFvxyiSdn0yK92b4VJT4hIa5UjRkkQ43qwZBIpw5cfhXRXUm7sH6UNiTnLSC4jtFaphrXNSjVsaphMjVi573JjWCIBzTsjxW4PZe7doa7fgilh1gN9CQySFsSzhxGbGMWRqh8wuAEih7CogXIs7YaTq1NQpjLTkTAmcL0HPVYToWnR6D1xyFVUa3hZ8JvUF5bLel84Dljn57NO0ou60O2D6akQ6FuzOnO4cjyLGjvFamVHCanXJlx8paI3DTIT2NluMOtYnk0wyVjcrQlP2b9D63r7th2kH1SAe7vrqh0sIEHqmqho6IoiLSaB19buKuMFP1HViXSxsbsncElZrVwRKQVzPEb9NiqFAjjR7gXuQwMw1knmCvJZyNgmJPaFys0QqmylanmWt6QmH6JiaryIGW8QAxup14BQBCja46SSt8iVvhKXgv3PQf9FObULnkRDrRLFrFo4X4NqnOTAA3RCzK4qDAHuJch3l6oV4FGxkeSgvBZnY6RFCtKm01eZts7o1pC3w3zslKcB7l0wFYp5ES1080XKFRYvWiT8Y4rU0OKzjUy6Ow96jJ1kOJi0q7aJHf40x3Uy7hHLGSek2Rdmr0urzwnrsqPo01Uz2MhpnQZOYckMYMhkXFHRwzTQgXFBX4RwX6owlCnoGNDXjpLYG6t24OOTac9yfDPnUbSo3aQcXxxAcPHxfjaxfSbMrE8NDgSuHACUOum8UVnwFe2UwKUcT4fryjrN8umhtFI92zN0y5TqS1ykpL7IlxiSyPRZa5VnSOvLZ5AYZofMSCfPOUtB0YK22NKHQdt21oIfTqYkHIITMJnb6JKk9iWC16J5X5sORt0q1u1fX1S6syHUo7ebgh1CoGz7gA46gFJOZGHEGW4nN1NYBrAEgXAyNqKcZFLH7AQlpbTmV4VkeIbYJs7n44l8aDa3w9EVaL0paLQo3OTAP3dvleavBGPDkV6m6exK2n5GnjSlS4eDggVDSVUNDGYnvXalFKJS3mUrezKKMKmY4Y8PbdYfhCecBryitcQb2CVvfnp5olH9fw8ehx1RUBfbTwjMED2VVSS35yAeDc7ocFRDarSNtoHosvWKFy7AyDACsUoPFjEF568135GjWsT7aRkQd76w9osGFIysWFfpW5yK8ygF46b1vGZJtfcW656RC9YdsOSaoTKL34bez6d5ZmQ6anict9TVAsrCztpNh1rHKCAnRh3z13MrAWfSLsAMQJPZ02mcZnqoJiiLvnOZ6RY94aC5sCDvcqYl0Z17ckj2GrMmOTuTaM7gxKXljFqZxh7AE2Z4MR2o6YN9I6y7isoOeT2W4RWbu2VCPiKFqncWCVsM11OiUfEiOWDFjkwfQ6wOGvCgS8ICzQW0IAMG8xLtjZzuLdCCMprySFLrG7MNr7b3Bs61NGyEqdO9Tp68ijudK2dz4Vu4SMXdmqbbQw36xIVgCRClfhcsyCiLhPQsHxBNw13a3XMhZp96vcQscCnr2yqgJgvsEZxmMTxQmSMTpeJolVlUOdvnmklf8OOKyZrfzrKinsRTpnRz4hh6kSw8tu5lIkYn6bOlcig6hwCokGh5V8liHoWtTvVNTz71dCYPy0divEhhLsn8pAByowmwB22KygF7W9QaHA30EDSP9W3lYBtWBTuCgpCNfdZLjJLB5KkUUqCPSBpwvECOiVjUlToscqY4Oun8ae7KAx6r6mQA8zaWzZr2gl4zvO3utsoIYdW6GQUlss0AUVkxb3MqIyXuImVSs22LuDQKsokqkiJRyM3F3LMh4e7SCAqW7PAa4yAqIufSGrMnDYTYfS90WnGllDTfCbPInjVCPKKvgqiFnffND4mWC1Uh1QBkh24TckP0wnhuOZeyTRRPEmriy1nf2FmlF3XU7GCpXtHKdIi8nsFzpV7IjE7DAXfJUxYqhBgTPGczEmXdK4U8Gprks75liM0f3hEojPC6t0Nvh46iU18g1HG41d4okNAASRFhak2dORcP3BZyPJDLwAIpN6xBLdl8kqumufPCAG9UenYwStIYGIU4RxJ087rBCe93Y4U8fULBKSySBewhBqknJ7xwvGrsknUT9Kd8Thh3SIxnQEtv98w4PynKWASnFGZRQR71yJFDWpgAtmN100ihnpdqxRCcFWst5YIoMK1eGvdjxn0WLyeqzeN0GkenTdBiFLc4QtDfbYQbIokGFzwCIlq6GNyiWvyHsU0TjFPBc91HagLwXksPRHJPQxwiSrRkq7B5UBY23l7OJkXkIwcOUpu0ziG8BddwukCjT6ejYPVyR25m1ltfpFyoEYq6gGQZ36HqGKaLlnIoI9s99XV08VqOtVB5HVML4wCMXa7FaB10oyo9jy2E1IAjwrzAflpKXEWne1E15NSKg0N11whw54N6xf8uLyzglJPdjKZZVVrFRPLoPriqPwD3A7LKmy43vPLX97MrmdmuFY2w12skrGEXgPoWdqH1CERA4M4LhKQsOkSjFAYrrWt1DDhb1Ila1FMPRoq0mAYko2cjRfiYHAYFJfxkSD2qLHIt4qvTvoVrfwMt7LlR0rMiqGWxRbAZxoK3TxMlDmip7W8uE2aLBpVosJsx3mtsjyeh1kjncPHTEvT03i0hAKvpsdGDnts17cDMLA2kj36V0SahyPMSJWceEl222WTTTZffSge7yj5tU28b84DaMaOGZ8xFXSAqbyRpk6JIhRU7QutwXyCXRf8fbW4MjvNh2Fd7zaLnslD5MYN1g1ZSeqZSnpMnoZoarJSmlMKWVBm3TnlrFc3yHufYsUxJo1qP1hGQmZW9uoMjHVDZvDGiKxaxkkjZaM7U4nkSIh4sJjVkrXQFo7wwldEOJ4R9AgO5YRJimvkN6uXWKYbk7PLrY5Hon5htSbWy44l5TScsHSsmVT1hbJviIdHRvRMVbyPInafJPlQv2y1PKfwuyJIapYMQxNUPo1rOqFFpkMoHWIzCODK9IpUVYpFZE4JEhT5pnqTeRJxmrxvb4EuPGgd2jarO4aV05wKkjnmVSkpcurW7oZU6oEXRCqEzKXMGY4oBc8LbsZ4LMsVy2va1qpINqHQ3XBMO2FTDMUQIVL6ZKVCbiRHkSZbcb0YMjbneHvqjA8OxwhBIVJHR2u88hEeCPLnC6Aldtj8MStYd2MVX84JAbg2Ex9Z3xZ0e2XZQJLxKRIRq1AsZOe7s5HuIrbCNZIxzevnTPSMlhMilYrYbmQ3AmybdT20k0l99ELTVoU6tQeliov8LxEwpIgykKNSacSGBwayT0gH0EZpASsrs3rsv29NEOJzXtz94OgLiQU5BiZ5VyVl4MI4IPKyPvlog4LVgFV2qZSty9x9VXfeWTm8zxKOaBR1RV8Hi1sRw1peADLASmvCi9lQWWUw8fFFCAe5dUMhmrWGM8gGP919gKnqylw9GAl07pko9w1R6G3S1vKbvdjD9gSNXLQVf4M1G1CrfuHplDBZFGmfMrFA6uqZGptSZS2Kb4WZFCvkbcHgdDUlp2L05Oo7UhEJKhUs7hd[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.
    • ripdad
      By ripdad
      Reproducer...
      TCPStartup() ; TCPConnect('212.227.91.231', '80') Local $error = @error MsgBox(0, 'AutoIt Version: ' & @AutoItVersion, 'AutoIt Error: ' & $error & @CRLF & 'WSAError: ' & _WSAGetLastErrorEx() & @TAB) TCPShutDown() ; Func _WSAGetLastErrorEx() Local $a = DllCall('ws2_32.dll', 'int', 'WSAGetLastError') If @error Or Not IsArray($a) Then Return SetError(1, 0, 'FuncError -1') $a = DllCall('kernel32.dll', 'int', 'FormatMessage', 'int', 0x00001000, 'ptr', 0, 'int', $a[0], 'int', 0, 'str', 0, 'int', 2048, 'ptr', 0) If @error Or Not IsArray($a) Then Return SetError(1, 0, 'FuncError -2') Return $a[3] & ' - ' & StringStripWS($a[5], 7) EndFunc Tested: autoit-v3.3.12.0, autoit-v3.3.14.0 and autoit-v3.3.15.0 beta on Win7.
      Seems to have started with autoit-v3.3.14.0.

       
    • Rimoun
      By Rimoun
      Hello Everyone
      this is the first time to post a problem with autoit, I have been using it for more than 3 years but im still feel new
      I have a VPS running online game ,
      -snip-
    • algiuxas
      By algiuxas
      Hello everybody,
      I'm making an program witch reads packets from server/client, first of all it reads size of the packet(it may be 1-5 bytes in size), and then reads what's left.

      Problem: TCPRecv($socket,1,1) tooks really long to receive 1 byte, most of the time 100ms!
      You can see packets here and how much time it took to read size of them(1-5 bytes, all of them are 1 byte in size): 0xAA63 (99.8802703210873ms) 0x53 (99.8829718030123ms) 0x2B (99.7435753356861ms) 0x4E (100.176352740059ms) I want to interrupt sometimes server or client, send packets, but I cannot send packets if server/client didn't get last packet. Sometimes packets are huge(16MB or even more), sometimes they are 2-6 bytes in size. I just don't want to receive everything and just send it. I want to see every packet, and collect data from these packets.
      EDIT: I receive couple packets at the same time with TCPRecv to make it faster. I use TCPRecv($socket,10000,1). It made program a bit faster... But still, when receiving again these packets, it still tooks 100ms. It's still slow.

      How to make TCPRecv($socket,1,1) faster? I don't need any error checking or etc., just to make it as fast as possible. (I only receive everything in hexadecimal)

      I really need help with this... It's so slow and annoying!
    • ripdad
      By ripdad
      This script is based on algorithm code from EnrMa.
      Updated: January 07, 2017
      Changes are in the script header.
       LocalProxyServer_v0.15b.au3
       
      Known Issues:
      POST is not working consistently in uploading files. AutoIt x64 does not work properly with this script.