[Text] Programmieren eines Winsock Arrays Verfasst am: 06.08.2007, 19:35
Thema: Winsock Array
1. Was ist ein Winsock Array und wozu braucht man es?
Ein normales Winsock werden die meisten von euch ja schon kennen, besonders wenn ihr euch das super Videotutorial von Bitchkiller angesehen habt.
Wenn nicht, dann solltet ihr das zuerst tun: http://www.vb-x.org/viewtopic.php?t=685
Also wozu braucht man nun ein Winsock Array?
Ganz einfach. Bei einem normalen Winsock stößt man recht schnell an Grenzen, besonders, wenn man eine Applikation programmieren möchte die mit mehreren Verbindungen umgehen muss. Wenn ihr also z.B. eine Sin Console programmieren und nicht hunderte Winsocks erstellen wollt, was natürlich nicht nur enorme Arbeit wäre, sondern auch ziemlich dämlich und von vornherein begrenzt von den maximalen Verbindungen, braucht ihr ein Winsock Array.
Ein Winsock Array ist ein normales Winsock, dem wir als Index eine Null zuweisen.
Sobald eine Anfrage zur Verbindung einlangt, erweitern wir dieses Array.
2. Winsock als Array beim Client einrichten
Ich gehe mal davon aus, dass ihr euch gut genug auskennt und wisst wie man ein Winsock Control erstellt.
Das wichtigste ist jetzt, dass ihr in den Eigenschaften vom Winsock Control bei „Index“ eine 0(Null) hineinschreibt.
Jetzt sieht eine Sub von Winsock z.B. so aus:
Code:
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Wie ihr seht, bekommt ihr jetzt den Index der Verbindung, die euch etwas sendet, übergeben.
Also jede Verbindung die ihr mit einem Server aufbaut, bzw. der Server mit euch, hat einen eindeutigen Index zugewiesen bekommen.
Das zuweisen des Indexes müssen wir uns dann noch selber basteln, aber vorher wollen wir unser Winsock Control auf Listen setzen.
Code:
Private Sub Form_Load()
Winsock1(0).LocalPort = 2222
Winsock1(0).Listen
End Sub
Also das Winsock Control mit dem Index 0(Null) dient uns nun zum warten auf Verbindungen und herstellen dieser.
Jetzt müssen wir eingehende Verbindungen entgegen nehmen und jeweils einen Index zuweisen. Dafür hab ich eine nette Funktion für euch, die den nächsten freien Index ermittelt.
Code:
Private Function FindFreeIndex() As Integer
Dim i As Integer
For i = 1 To Winsock1.Count - 1
If Winsock1(i).State = sckClosed Then
FindFreeIndex = i
Exit Function
End If
Next
'Falls keine Verbindung frei ist, wird eine angelegt.
FindFreeIndex = Winsock1.Count
Load Winsock1(FindFreeIndex)
End Function
Das ist jetzt lediglich die Funktion zum ermitteln eines freigewordenen Indexes. Falls keiner frei ist, wird einfach ein neuer angelegt.
Und den Index weisen wir so zu:
Code:
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Winsock1(FindFreeIndex).Accept requestID
End Sub
So wird einer eingehenden Verbindung also ein Winsock, bzw. der Index eines Winsocks zugewiesen.
Wenn etwas an den Clienten gesendet wird sieht die Annahme so aus.
Code:
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As String, cmd() As String
Winsock1 (Index).GetData data
cmd() = Split(data, "#")
Select Case cmd(0)
Case "msgbox"
Call MsgBox(cmd(1))
End Select
End Sub
In Index wird uns logischerweise der Index der Verbindung übergeben.
Mit data empfange ich den String, der gesendet wurde und in cmd() Splitte ich den String auf.
Beim Server braucht ihr nichts zu ändern. Aber der Client kann nun mit einigen Servern umgehen.
Das wäre jetzt also ein Winsock Array für z.B. eine Sin Console. Aber über dieses Winsock solltet ihr nicht unbedingt alle Befehle/Daten laufen lassen.
Am besten macht ihr euch noch ein Winsock Array bei dem dann der eigentliche Datenverkehr stattfindet.
Also Winsock1 sollte sich nur um die SinConsole kümmern.
Wenn man dann eine richtige Verbindung zu einem Server haben möchte, wo man weitere Funktionen nutzen kann, sollte vom Winsock1 an den Server eine Message gesendet werden, worauf der Server die Verbindung zum Winsock2 aufnimmt.
Nun besteht also die echte Verbindung, bei der alle Funktionen genutzt werden können.
Der Aufwand ist deshalb gut, da man einen besseren Überblick im Code hat und es auch viel leichter zu coden ist, als wenn man alles in eine Sub packen muß.
Das nächste Tut wird vom Datentransfer mit dem Winsock handeln.
Bis dahin beschäftigt euch kräftig mit dem Winsock Array.
mfg _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Zuletzt bearbeitet von ZiG_ am 19.11.2007, 19:07, insgesamt einmal bearbeitet
Knucki_ Newbie
Anmeldedatum: 04.08.2007 Beiträge: 15
Verfasst am: 06.08.2007, 20:14
Wow! Wirklich sehr gut erklärt!
1A!
PS: enco -> Sie haben Post! _________________
413X_ « Moderator »
Anmeldedatum: 16.12.2006 Beiträge: 266
Verfasst am: 06.08.2007, 22:15
Zitat:
ich denke damit werden die meisten Leute hier ihren Trojaner schreiben können
haha ^^ das glaubste doch wohl nich selber =)
sie KOENNTEN es ^^
aber tun wirds wohl eh keiner -> "schreib mir ma bitte nen trojaner" xD
Nunja, jetzt habe ich es halt auch soweit, dass mehrere clients zu dem Server connecten können, aber nur die können dann dem Server nachrichten schicken, und der denen nicht. Und wie ginge das mit der weiterleitung der Antworten auf die anderen Clients und wenn der Server was schreibt, dass der das auch den anderen Usern schickt?
Also im Prinzip frage ich mich, wie man dadurch einen "Multiuserchat" erstellen kann...
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 19.09.2007, 20:00
Im Grunde brauchst du dazu nur ein Liste, bzw. ein Array indem alle angemeldeten Clienten eingetragen sind mit ihrem zugewiesenen Index.
Der Server empfängt die Daten und geht dann die Clienten in der Liste durch und sendet diesen auch die empfangenen Daten. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Illuminat23_ Newbie
Anmeldedatum: 07.10.2007 Beiträge: 1
Verfasst am: 07.10.2007, 14:45
Wohoo
Mein erster Post nur für dich und ich bedanke mich _________________ Kommunikation ist nur unter gleichen möglich
//by Hackbard Celine
krallistic_ Newbie
Anmeldedatum: 24.09.2007 Beiträge: 13
Verfasst am: 04.12.2007, 16:17
nur zum verständnis ...
winsock.count gibt die anzahl der aktuell geöffneten sockets aus im Array aus?
Nein .count gibt aus wieviele Winsocks im Array sind, egal welchen Status sie haben. _________________
Fuka_ Coder
Anmeldedatum: 15.11.2007 Beiträge: 96
Verfasst am: 01.04.2008, 11:58
Jo echt gut beschrieben!
Aber wenn ich mit dieser Technik einen kleinen RAT code, muss der Server dann die ports am router freigeben?
Also ist das eine reverse connection? Ich bin grad verwirrt^^