[AutoIt] TCP Tutorial

06/07/2011 21:45 animeprince#31
Jap ist ein relativ altes TuT aber ändert ja nix am Inhalt^^
b2t ist das Tut richtig nice. Hab da vllt nen kleinen Makel gefunden. Sollte bei den Fehlermeldungen im Client nicht ein Exit hin da sonst der Code ja tdm weiter abgearbeitet wird obwohl ein Fehler auftrat?

Ach und kannst du mir vllt genauer erklären was es mit IP und Port auf sich hat? Sagen wir ich habe ne AutoIt GUI mit nem Textfeld. Dort gebe ich i-einen Text ein und der soll dann in nem Thread hier gepostet werden. Wie komme ich an die IP und an den Port den ich brauche?
06/07/2011 22:25 Ende!#32
Quote:
Originally Posted by animeprince View Post
Jap ist ein relativ altes TuT aber ändert ja nix am Inhalt^^
b2t ist das Tut richtig nice. Hab da vllt nen kleinen Makel gefunden. Sollte bei den Fehlermeldungen im Client nicht ein Exit hin da sonst der Code ja tdm weiter abgearbeitet wird obwohl ein Fehler auftrat?
Ja, eigentlich schon. Ich bin jetzt aber offen gesagt zu lazy das Ganze zu editen :p Hab seit über 'nem Jahr eigentlich nichts mehr mit Au3 am Hut. Dennoch danke für den Hinweis.

Quote:
Originally Posted by animeprince View Post
Ach und kannst du mir vllt genauer erklären was es mit IP und Port auf sich hat? Sagen wir ich habe ne AutoIt GUI mit nem Textfeld. Dort gebe ich i-einen Text ein und der soll dann in nem Thread hier gepostet werden. Wie komme ich an die IP und an den Port den ich brauche?
Die IP könntest du z.B. bekommen, indem du in der cmd den Befehl "ping elitepvpers.com" eingibst. Nur wird das bei e*pvp nicht klappen, da der DDoS Filter den Ping nicht durchlassen wird ;p Aber du kannst einfach einfach die IP per DNS-Auflösung zur Laufzeit holen. Schau dir mal die Funktion TCPNameToIp an (so hieß sie, wenn ich das recht in Erinnerung habe). HTTP Standard-Port ist 80.
06/08/2011 11:43 animeprince#33
Quote:
Originally Posted by Ende! View Post
Ja, eigentlich schon. Ich bin jetzt aber offen gesagt zu lazy das Ganze zu editen :p Hab seit über 'nem Jahr eigentlich nichts mehr mit Au3 am Hut. Dennoch danke für den Hinweis.
Faule Socke =D
Was machste denn stattdessen? Ich bin immer offen für neues^^


Quote:
Originally Posted by Ende! View Post
Aber du kannst einfach einfach die IP per DNS-Auflösung zur Laufzeit holen.
Hmm~ Das musst du mir mal näher erläutern^^'



€DIT:
Also ich möcht in AutoIt ein Programm zum SMS versenden schreiben (naja eig. so ne Art SMS Bomber aber ma sehen xD). Dazu werde ich eine GUI erstellen mit einem Eingabefeld für die Handynummer und wieviele SMS verschickt werden sollen. Außerdem ein Drop Down Menü zum Auswählen des Landes (da man das bei dem Anbieter den ich gewählt habe auswählen muss). Das erstmal zum groben was nichts mit dem Thema zu tun hat. Nun aber zum TCP. Undzwar will ich im Hintergrund die Daten an den Anbieter (Server) senden, also die Handynummer und das Land und dann versenden. Problematisch wird die Eingabe des Captchas (ne Idee wie ich das hinbekomme?)... Das dann halt so oft wie eingestellt wurde (am besten über Proxy)...
Hört sich kompliziert an aber vllt kannste ja helfen =D
06/08/2011 14:29 Ende!#34
Quote:
Originally Posted by animeprince View Post
Faule Socke =D
Was machste denn stattdessen? Ich bin immer offen für neues^^
C++ :p

Quote:
Originally Posted by animeprince View Post
Hmm~ Das musst du mir mal näher erläutern^^'
Code:
$ip = TCPNameToIp("elitepvpers.com")
06/08/2011 21:30 animeprince#35
Ahh ja C++ hab ich einmal mit angefangen aber i-wie... kP ich glaub da war ich noch zu neu für xDD AutoIt Begriffe sind ja einfach nur easymode^^

Ahh auch wenn das weniger erläutert war meine ichs verstanden zu haben xP

Haste mein Edit oben absichtlich übersehen? xD
06/13/2011 15:24 Jay Niize#36
Alt aber genial. Aber wie kann ich über TCP Daten, bzw. Pakete senden? :O

Edit : In VB is es ja dieser Befehl :
Quote:
Imports System.Net
Imports System.Net.Sockets

Dim sroSocket As Socket

//Connect to phConnector:
sroSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

Dim IP As IPAddress = IPAddress.Parse("127.0.0.1")
Dim Port As Integer = 22580
Dim IPEP As IPEndPoint = New IPEndPoint(IP, Port)

sroSocket.Connect(IPEP)

//Sub to send a packet:
Sub SendPacket(ByVal OpCode As String, ByVal sData As String)
Using buffer As New IO.MemoryStream
Using w As New IO.BinaryWriter(buffer)
w.Write(CUShort(0))
w.Write(CUShort("&H" + OpCode))
w.Write(CUShort(1))

For i = 0 To sData.Length / 2 - 1
w.Write(CByte("&H" & sData.Substring(i * 2, 2)))
Next

w.BaseStream.Position = 0
w.Write(CUShort(w.BaseStream.Length - 6))
w.Flush()

sroSocket.Send(buffer.ToArray)
End Using
End Using
End Sub

//Call the SendPacket-Sub:
SendPacket("YourOpCode", "YourData")
06/13/2011 18:14 omer36#37
Von einem Epvpers user (weiß aber nicht mehr von wem)
Zwar nie wirklich getestet, aber sollte gehen...


Client:
PHP Code:

;==== CLIENT ====;

Global 
$IP = IniRead(@ScriptDir & "\options.ini", "Connection", "IP", "127.0.0.1")     ;IP wird aus der ini gelesen
Global $Port = IniRead(@ScriptDir & "\options.ini", "Connection", "Port", "4949")      ;Port wird aus der ini gelesen
Global $MaxLen = IniRead(@ScriptDir & "\options.ini", "Connection", "MaxLen", "2048")  ;Maximale Bitrate wird aus der ini gelesen

TCPStartup
()

$Connect = MsgBox(0x21, "INFO", "Mit Server verbinden?")
If 
$Connect = 2 Then
    TCPShutdown
()
    Exit
EndIf

MsgBox(0x40, "INFO", "Verbinde nun mit Server")

_connect()


Func _connect()
    
$MainSocket = TCPConnect($IP, $Port)
    If 
$MainSocket = @error Then
        $Error 
= MsgBox(0x15,"ERROR","Konnte nicht mit Server verbinden."&@CR&"Bitte überprüfen Sie die Einstellungen."&@CR&"Noch einmal versuchen?")
        if 
$Error = 2 Then
            TCPCloseSocket
($MainSocket)
            
TCPShutdown()
            Exit
        ElseIf 
$Error = 4
            TCPCloseSocket
($MainSocket)
            
_connect()
        EndIf
    EndIf
    Do
        
$get = TCPRecv($MainSocket,$MaxLen)
    
Until $get <> ""

    
Do
        
$get_FileName = TCPRecv($MainSocket,$MaxLen)
    
Until $get_FileName <> ""
    
$FileName = BinaryToString(StringRight($get_FileName,Dec(StringLeft($get_FileName,10))))
    Do
        
$get_FileSize = TCPRecv($MainSocket,$MaxLen)
    
Until $get_FileSize <> ""
    
$FileSize = Dec(StringLeft($get_FileSize,10))
    If 
$get = "0x" & StringToBinary("DATEI") Then
        $yes_no 
= MsgBox(0x44,"INFO","Der Server möchte eine Datei senden."&@CR&"Name : "&$FileName&@CR&"Größe : "&$FileSize&@CR&"Annehmen?")
        if 
$yes_no = 6 Then
            TCPSend
($MainSocket,"0x"&Hex(2)&BinaryToString("OK"))
            
$File = FileSaveDialog("Datei speichern als",@DesktopDir,"Alle (*.*)")
            
$open = FileOpen($File,2)
            
FileWrite($open,TCPRecv($MainSocket,$MaxLen))
            
FileClose($open)
            
MsgBox(0x40,"INFO","Datei wurde empfangen")
            
Run("explorer.exe /"&StringReplace($File,$FileName,""))
        ElseIf 
$yes_no = 7 Then
            TCPSend
($MainSocket,"0x"&Hex(2)&BinaryToString("NO")
            
TCPCloseSocket($MainSocket)
            
TCPShutdown()
            Exit
        EndIf
    EndIf
EndFunc   ;==>_connect 
Server:
PHP Code:
;==== SERVER ====;

#include <INet.au3>

TCPStartup()

Global 
$IP = _GetIP() ; ermittelt über DynDNS die IP
Global $PORT = 4949
Global $MaxLen = 2048 ;Maximale Speed die benutzt werden darf (ACHTUNG: BENUTZT BEI ZU VIEL DIE GANZE LEITUNG)

$MainSocket = TCPListen($IP, $PORT, 1)

MsgBox(64, "INFO", "Es gibt folgende DreiSchritte:" & @CR & "1.Datei Auswählen" & @CR & "2.Verbindung zum Cient herstellen" & @CR & "3.Datei senden")

$File = FileOpenDialog("Bitte wählen sie die Datei aus", @DesktopDir, "All (*.*)")

Do
    
$NewSocket = TCPAccept($MainSocket)
Until $NewSocket >= 0
TCPSend
($NewSocket, "0x" & StringToBinary("DATEI"))
TCPSend($NewSocket, "0x" & Hex(StringLen(FileGetLongName($File))) & StringToBinary(FileGetLongName($File)))
TCPSend($NewSocket, "0x" & Hex(FileGetSize($File)))
Do
    
$get = TCPRecv($NewSocket, $MaxLen)
Until $get <> ""

If $get = "0x"&Hex(2)&BinaryToString("OK") Then
    MsgBox
(64,"INFO","Datei wurde von Gegenstelle angenommen")
    
TCPSend($NewSocket,$File)
    
MsgBox(64,"INFO","Die Datei wurde gesendet")

ElseIf 
$get = "0x"&Hex(2)&BinaryToString("NO") Then
    MsgBox
(64,"INFO","Datei wurde von Gegenstelle angenommen")
    
TCPCloseSocket($NewSocket)
    
TCPCloseSocket($MainSocket)
    
TCPShutdown()
    Exit
EndIf 
09/11/2011 12:49 Incaner#38
Hab mal die script ein bissle überarbeitet und eine gui hinzugefügt:

Server:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
= TCPListen("0", 4321) ; Den mainsocket erstellen

While 1 ; Endlosschleife 
    $acceptedSocket 
= TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
    
    
If $acceptedSocket <> -1 Then ; Wenn $acceptedSocket ungleich -1 ist, ...
        
$receivedData = TCPRecv($acceptedSocket, 1024) ; Wenn eine Socketverbindung hergestellt wurde, empfange ein Paket vom Client ($connectedSocket)
        If 
Not $receivedData = "" Then
         MsgBox
(64, "Nachricht empfangen", $receivedData)
        
TCPCloseSocket($acceptedSocket)
        EndIf
    EndIf
WEnd 
Client:
PHP Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$_1 = GUICreate("Text to send", 518, 270, 192, 124)
$text = GUICtrlCreateInput("Hi. Dieser Text wurde vom Client gesendet", 64, 16, 433, 21)
$Button1 = GUICtrlCreateButton("Senden", 392, 208, 113, 49)
$status = GUICtrlCreateLabel("Drücken sie Verbinden", 16, 200, 205, 20)
$ip = GUICtrlCreateInput("", 64, 40, 433, 21)
$Label1 = GUICtrlCreateLabel("Text:", 32, 16, 28, 17)
$Label2 = GUICtrlCreateLabel("IP:", 40, 40, 17, 17)
$Button2 = GUICtrlCreateButton("Verbinden", 256, 208, 113, 49)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
= GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            _Func1 
()
        Case 
$Button2
            _Func2 
()

    EndSwitch
    
$ipp = GUICtrlRead($ip)
WEnd

Func    _Func1 
()      ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button1 zugewiesen wurde
$textt 
= GUICtrlRead($text)
$ipp = GUICtrlRead($ip)

TCPStartup() ; TCP wird initialisiert
$socket 
= TCPConnect($ipp, 4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socket" ab

If $socket = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    MsgBox
(16, "Error", "Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
EndIf

$sendedBytes = TCPSend($socket,$textt) ; Sendet den Text an unseren verbundenen Socket

If $sendedBytes = 0 Then ; Wenn der Rückgabewert von TCPSend(...) 0 ist, Fehlermeldung ausgeben
    MsgBox
(16, "Error", "Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
EndIf

If 
Not $ipp = "" Then
    
If Not $textt = "" Then
MsgBox
(64, $ipp, "'" & $textt & "'"&@CRLF& "" &@CRLF& "WURDE ABGESCHICKT") ; Fehlermeldung
EndIf
EndIf

TCPCloseSocket($socket)
TCPShutdown()  
EndFunc

Func    _Func2 
()
    
$ipp = GUICtrlRead($ip)
    
TCPStartup() ; TCP wird initialisiert
    $socket 
= TCPConnect($ipp, 4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socket" ab
    
If $socket = -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
    $status 
=  GUICtrlCreateLabel("Keine Verbindung zum server", 16, 200, 205, 20)
    
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    
GUICtrlSetColor(-1, 0xFF0000)
EndIf

If 
$socket > -1 Then ; Wenn $socket = -1 ist, Fehlermeldung ausgeben
$ipp 
= GUICtrlRead($ip)
$status =  GUICtrlCreateLabel("Verbunden mit " & $ipp, 16, 200, 205, 20)
    
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    
GUICtrlSetColor(-1, 0x00FF00)

EndIf
TCPCloseSocket($socket)
TCPShutdown()  
EndFunc 
01/22/2012 13:34 MrRobb#39
richtig hammer geiles TUT!!!
Danke! Hast ein Thanks verdient.
Anhangs Tuts wären jetzt auch noch super...
also bis dahin, dass man mit AutoIt (TCP) "Hacken" (Boten) kann. Also wie man richtig decodiert und dann die entsprechenden Befehle an den richtigen Server (z.B. Metin2 Server) sendet.
01/22/2012 14:21 jacky919#40
Guck mal sieben Posts höher, da schreibt Ende! das er seit einem Jahr nichts mehr mit AutoIt zu tun hat und das ist beinahe sieben Monate her...
01/22/2012 18:08 MrRobb#41
ich meine ja nicht, dass er die nächsten Tuts erstellen muss :P Wäre aber toll, wenn JEMAND das machen würde, der Ahnung davon hat :)
*schmoll*
01/22/2012 18:22 jacky919#42
Nur wenn du sie "Anhangs" Tutorials nennst, hängen sie ja an irgenwem oder irgendetwas. In dem Falle an diesem Tutorial ;)

Außerdem gibt's das im Grunde schon, z.B:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
Vielleicht findest du etwas verwertbares..
04/19/2012 19:08 H@CT0R#43
Sehr gutes Tuturial, danke dafür! Habe vor ein paar Tagen mit AutoIT angefangen und bin begeistert, man kann mehr damit machen als ich anfangs erwartet hatte

Habe beim Durchgehen dieses Tuturials schon etwas mehr in server und client eingebaut, ein Eingabefeld in den Client um eine bestimmte Nachricht zu senden und in die server.au3, wenn diese Eingabe 'Exit' ist, dann wird der Server heruntergefahren

Nur eine Frage hätte ich, wie kann ich das ganze über verschiedene PC's machen? Also übers Internet sodass ein Chat daraus wird?
07/11/2012 20:31 PUCKYPUCKY#44
sehr hiflreich
03/06/2013 10:06 dacx#45
Für TCPStartup() wird keine Include-Datei benötigt?