Umgang mit einem Winsock Array Verfasst am: 17.04.2008, 11:04
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()<br />Winsock1(0).LocalPort = 2222<br />Winsock1(0).Listen<br />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<br />Dim i As Integer<br />For i = 1 To Winsock1.Count - 1<br /> If Winsock1(i).State = sckClosed Then<br /> FindFreeIndex = i<br /> Exit Function<br /> End If<br />Next<br />'Falls keine Verbindung frei ist, wird eine angelegt.<br />FindFreeIndex = Winsock1.Count<br />Load Winsock1(FindFreeIndex)<br />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)<br />Winsock1(FindFreeIndex).Accept requestID<br />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)<br />Dim data As String, cmd() As String<br /><br />Winsock1 (Index).GetData data<br /><br />cmd() = Split(data, "#")<br />Select Case cmd(0)<br /> Case "msgbox"<br /> Call MsgBox(cmd(1))<br />End Select<br /><br />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 _________________
igoe Gast
Verfasst am: 04.05.2008, 16:03
Danke für das Tutorial, habe nämlich gerade ein Problem mit Winsock&Array ^^ vll bekomme ich es ja hin.