[AutoIt] TCP Tutorial

10/17/2009 19:07 Ende!#1
Hi Leute!

Da ich TCP selber für ein interessantes Thema halte, hab ich mal ein Tutorial darüber geschrieben. Have Fun! ;)

Inhalt:
[-] Voraussetzungen
[-] Was ist TCP?
[-] Client erstellen
[-] Server erstellen

-----------------------------

[-] Voraussetzungen
Ihr solltet die Grundkrentnisse wie Schleifen, If-Abfragen, Variablen und ähnlichem draufhaben. Mehr braucht ihr eigentlich nicht ^^

-----------------------------

[-] Was ist TCP?

Ich versuche das ganze mal einfach zu halten und die Fachbegriffe wegzulassen :)

Jeder PC hat im Internet eine einzigartige Adresse, welche sich nur ändert, wenn man z.B. seinen Router neustartet. Diese Adresse wird IP-Adresse genannt. TCP ist ein Protokoll zur Übertragung von Daten über das Internet. Wenn sich ein Client mit dem Server verbinden möchte, sendet der Client ein Authentifizierungspaket an die IP des Servers. Wenn der Server auf die Verbindung eingehen möchte, antwortet er mit einem weiterem Paket an die IP des Clients. Sobald das abgeschlossen ist, besteht eine Verbindung zwischen eurem Computer (dem Client) und dem dem Server. Diese Verbindung nennt man Socket. Über diesen Socket können der Client und der Server nun Daten austauschen.

Beispiel:
Ihr wollt elitepvpers.com aufrufen, also sendet euer Browser (in dem Fall der Client) an elitepvpers.com (der Server) ein Paket, dass er eine Verbindung herstellen möchte. Nun antwortet der Server mit einem Paket und der Socket (die Verbindung zwischen beiden) wird erstellt. Nun sendet euch der Server den Inhalt der aufgerufenen Website.

Das Beispiel war jetzt stark vereinfacht, sollte euch aber trotzdem dabei helfen zu verstehen was TCP ist.

Falls ihr immer noch nicht verstanden habt was TCP ist, könnt ihr euch ja nochmal den Beitrag bei Wikipedia dazu ansehen: Link

-----------------------------

[-] Client erstellen

Zuerst werden wir den Client erstellen.

Der Client muss:
1. Einen Socket zu dem Server herstellen
2. Prüfen ob die Socket-ID gültig ist
3. Daten an den Server senden
4. Prüfen ob die Daten erfolgreich gesendet wurden

Also, let's start ;)

Zuerst erstellen wir ein Autoit Script und nennen es z.B. "client.au3". Danach müssen wir TCP initialisieren. Das machen wir mit:
PHP Code:
TCPStartup() ; TCP wird initialisiert 
Nachdem das getan ist, versuchen wir eine Verbindung zu unserem Server herzustellen (was natürlich momentan scheitern würde, da wir den Server noch nicht erstellt haben). Der Befehl dafür lautet: TCPConnect(IpAdresse, Port)
Fügen wir das in unser Script ein, sieht das ganze so aus:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$socket 
TCPConnect("127.0.0.1"4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socketab 
TCPConnect gibt bei Erfolg einen Socket und bei einem Fehlversuch -1 zurück. Die Socket-ID speichern wir in der Variable "$socket" ab, da wir den Socket ja später auch noch verwenden möchten.

Als nächstes testen wir, ob unser Socket erfolgreich hergestellt wurde:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$socket 
TCPConnect("127.0.0.1"4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socketab

If $socket = -1 Then Wenn $socket = -1 istFehlermeldung ausgeben
    MsgBox
(16"Error""Die Verbindung zum Server konnte nicht hergestellt werden!") ; Fehlermeldung
EndIf 
Die If-Abfrage stellt sicher, dass unser Socket erfolgreich hergestellt wurde (Wir erinnern uns: Wenn TCPConnect(...) -1 zurückgibt, ist etwas schief gelaufen).

Der nächste Schritt wäre jetzt Daten (in unserem Fall ein wenig Text) zum Server (welchen wir ja später noch erstellen werden) zu senden. Der Befehl zum senden von Paketen lautet in AutoIT: TCPSend(socketID, datenDieGesendetWerdenSollen)
Bauen wir das wieder in unser Client Skript ein, sieht das ganz so aus:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$socket 
TCPConnect("127.0.0.1"4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socketab

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

$sendedBytes TCPSend($socket"Hi. Dieser Text wurde vom Client gesendet :)") ; Sendet den Text an unseren verbundenen Socket 
Wenn alles glatt läuft, gibt TCPSend(...) die Anzahl der gesendeten Bytes zurück, wenn nicht wird 0 zurückgegeben.

Um ganz sicher zu gehen, dass unser Paket auch ankommt, prüfen wir den Rückgabewert von TCPSend(...) nochmal:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$socket 
TCPConnect("127.0.0.1"4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socketab

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

$sendedBytes TCPSend($socket"Hi. Dieser Text wurde vom Client gesendet :)") ; Sendet den Text an unseren verbundenen Socket

If $sendedBytes 0 Then Wenn der Rückgabewert von TCPSend(...) 0 istFehlermeldung ausgeben
    MsgBox
(16"Error""Das Paket konnte nicht gesendet werden.") ; Fehlermeldung
EndIf 
Als letztes schließen wir den Socket noch und fahren TCP herunter:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$socket 
TCPConnect("127.0.0.1"4321) ; Versucht eine Verbindung zum Server aufzubauen und speichert die SocketID in "$socketab

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

$sendedBytes TCPSend($socket"Hi. Dieser Text wurde vom Client gesendet :)") ; Sendet den Text an unseren verbundenen Socket

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

TCPCloseSocket($socket)
TCPShutdown() 
Unser Client ist jetzt fertig, also weiter zum Server :)

-----------------------------

[-] Server erstellen

Der Server muss:
1. Auf eine Verbindung mit einem Client warten
2. Wenn eine Verbindung ankommt, die gewünschten Daten an den Client senden

Let's go ;)

Wir erstellen uns ein weiteres Script und nennen es z.B. "server.au3".

Der Server muss:
1. Auf eine eingehende Verbindung von einem Socket warten
2. Wenn eine Verbindung hergestellt wurde, die gesendeten Daten verarbeiten (in unserem Fall einfach in einer Message Box ausgeben)

Als erstes wird wieder TCP initialisiert:
PHP Code:
TCPStartup() ; TCP wird initialisiert 
Als nächstes müssen wir einen Mainsocket erstellen, mit den unser Server dann auf Verbindungen wartet. Das geschieht mit: TCPListen(ip, port)
In unser Script eingebaut sieht das ganze so aus:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
TCPListen("127.0.0.1"4321) ; Den mainsocket erstellen 
Nun da der Mainsocket erstellt ist, warten wir auf eine Verbindung vom Client. Dafür benutzen wir eine Endlosschleife (While 1) und TCPAccept(mainsocket). Bei eingehender Verbindung gibt TCPAccept(...) eine Socket-ID zurück, ansonsten -1. Das bauen wir auch wieder ein:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
TCPListen("127.0.0.1"4321) ; Den mainsocket erstellen

While Endlosschleife 
    $acceptedSocket 
TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
WEnd 
Jetzt überprüfen wir, ob eine Verbindung zu unserem Server hergestellt wurde und versuchen ein Paket vom Client zu empfangen. Das geschieht in AutoIt mit TCPRecv(verbundenerSocket, maximaleLängeInBytes)
Das ganze jetzt wieder in unser Server-Script eingebaut:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
TCPListen("127.0.0.1"4321) ; Den mainsocket erstellen

While Endlosschleife 
    $acceptedSocket 
TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
    
    
If $acceptedSocket <> -1 Then Wenn $acceptedSocket ungleich -1 ist, ...
        
$receivedData TCPRecv($acceptedSocket1024) ; Wenn eine Socketverbindung hergestellt wurdeempfange ein Paket vom Client ($connectedSocket)
    EndIf
WEnd 
Wenn eine Verbindung akzeptiert wurde, versucht unser Script ein Paket vom Client zu empfangen und speichert es in $receivedData ab.

Als nächstes geben wir die empfangenen Daten einfach in einer Message Box aus:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
TCPListen("127.0.0.1"4321) ; Den mainsocket erstellen

While Endlosschleife 
    $acceptedSocket 
TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
    
    
If $acceptedSocket <> -1 Then Wenn $acceptedSocket ungleich -1 ist, ...
        
$receivedData TCPRecv($acceptedSocket1024) ; Wenn eine Socketverbindung hergestellt wurdeempfange ein Paket vom Client ($connectedSocket)
        
MsgBox(64"Nachricht empfangen!""Es wurde eine Nachricht empfangen: " $receivedData)
    EndIf
WEnd 
Jetzt müssen wir nur noch den Socket schließen:
PHP Code:
TCPStartup() ; TCP wird initialisiert

$mainsocket 
TCPListen("127.0.0.1"4321) ; Den mainsocket erstellen

While Endlosschleife 
    $acceptedSocket 
TCPAccept($mainsocket) ; Wir versuchen eine möglicher Verbindung anzunehmen
    
    
If $acceptedSocket <> -1 Then Wenn $acceptedSocket ungleich -1 ist, ...
        
$receivedData TCPRecv($acceptedSocket1024) ; Wenn eine Socketverbindung hergestellt wurdeempfange ein Paket vom Client ($connectedSocket)
        
MsgBox(64"Nachricht empfangen!""Es wurde eine Nachricht empfangen: " $receivedData)
        
TCPCloseSocket($acceptedSocket)
    EndIf
WEnd 
Und fertig ist unser Server :)

Wenn ihr nun erst die "server.au3" und dann die "client.au3" startet, sollte diese Meldung ausgegeben werden:
[Only registered and activated users can see links. Click Here To Register...]


Ich hoffe euch hat es geholfen, denn mich hat das ganze eine Menge Schreibarbeit gekostet :>

Falls ihr Fehler finden solltet, könnt ihr das gerne posten.

Lg,
Ende!
10/17/2009 19:23 Lümmeltüte#2
sehr gutes tut gut gemacht ;)
10/17/2009 20:03 burningwat3r#3
tolles tut vorher konnte ich es noch nich jetzt schon =)
10/17/2009 20:53 SCORNI#4
kann ich zwar schon aber für die arbeit gibt thx
10/17/2009 21:53 Ende!#5
Dann hab ichs wenigsten nicht umsonst geschrieben ;)
10/18/2009 11:06 Fresh^^#6
gutes tutorial...
Aber Frage:
Könntest du vill. noch n paar tipps geben für was man das verwenden kann oder überhaupt damit machn?
10/18/2009 12:16 Akorn#7
Quote:
Originally Posted by speidel View Post
gutes tutorial...
Aber Frage:
Könntest du vill. noch n paar tipps geben für was man das verwenden kann oder überhaupt damit machn?
Netzwerk verbindungen erstellen! Und darüber daten versenden.
10/18/2009 12:19 Ende!#8
Quote:
Originally Posted by speidel View Post
gutes tutorial...
Aber Frage:
Könntest du vill. noch n paar tipps geben für was man das verwenden kann oder überhaupt damit machn?
Man könnte damit z.B. einen Chat oder ähnliche Sachen die mit Internet zu tun haben schreiben.
10/18/2009 16:52 AllesVergeben#9
Oder 'nen Updater in den Bot bauen?

Übrigens gutes Tut, gehört aber glaube mal in 'ne andere Section. :)

#Thanked
10/18/2009 17:00 Ende!#10
Quote:
Originally Posted by AllesVergeben View Post
Oder 'nen Updater in den Bot bauen?
Hmm ... dann brauchste aber einen Root-Server xD

Quote:
Originally Posted by AllesVergeben View Post
Übrigens gutes Tut, gehört aber glaube mal in 'ne andere Section. :)
Ja? In welche denn? In die Tut Section nicht wirklich, ist ja AutoIt related. Oder trotzdem in die Tut Section? xD
10/18/2009 17:05 AllesVergeben#11
[Only registered and activated users can see links. Click Here To Register...] würde ich sagen, bin mir aber nicht sicher. ;)

Erklär mal das mit dem Root, wenn du willst, oder du kannst es auch gleich in den Tut einbauen wenn du Lust hast ;)
10/18/2009 17:27 Ende!#12
Quote:
Originally Posted by AllesVergeben View Post
[Only registered and activated users can see links. Click Here To Register...] würde ich sagen, bin mir aber nicht sicher. ;)
Verdammt, an die Section hab ich nicht gedacht ;) Naja, ich werd mal nen Mod anschreiben ob er moven kann xD

Quote:
Originally Posted by AllesVergeben View Post
Erklär mal das mit dem Root, wenn du willst, oder du kannst es auch gleich in den Tut einbauen wenn du Lust hast ;)
Du müsstest dir einen Server mieten und auf diesem ein Script laufen lassen, welches auf Anfragen von Bots wartet. Wenn ein Bot connected wird die aktuelle Versionsnummer ausgetauscht und wenn der Bot veraltert ist läd er halt über http die neue Version runter xD

Ich mach Update-Systeme aber immer anders ^^ Ohne Root-Server, vll schreib ich nachher mal ein Tut dazu ;)
12/03/2009 17:45 .nAno#13
nice TUT
bin vorher daran gescheitert, jetz klappts ;)
Du solltest aber vllt den socket wieder schließen, sons schießt der Speicherverbrauch ins unermessliche :P
12/08/2009 23:34 Ende!#14
Quote:
Originally Posted by .nAno View Post
nice TUT
bin vorher daran gescheitert, jetz klappts ;)
Du solltest aber vllt den socket wieder schließen, sons schießt der Speicherverbrauch ins unermessliche :P
Ty, done ^^
02/19/2010 11:57 Banana.Crafts#15
dafür liebe ich dich!
das erste TUT das funktioniert!
THX