Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Texte und Ebooks
Autor
Nachricht
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248

[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. Wink

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. Wink
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
Newbie



Anmeldedatum: 04.08.2007
Beiträge: 15


Verfasst am: 06.08.2007, 20:14

Wow! Wirklich sehr gut erklärt!
1A! Cool

PS: enco -> Sie haben Post!
_________________
 
413X_
« Moderator »<b><font color=green>« Moderator »</font



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

aber schoenes tut ^^
_________________

http://www.413x.dl.am

Tod den 1337-Scriptkiddies xD
 
r4z3r_
« Webmaster »<b><font color=red>« Webmaster »</fo



Anmeldedatum: 06.02.2007
Beiträge: 252


Verfasst am: 07.08.2007, 12:16

Ja, wirklich echt klasse Smile
...
wie immer^^
 
Elrohir_
Tutorial Leser
Tutorial Leser

Anmeldedatum: 10.09.2007
Beiträge: 59


Verfasst am: 19.09.2007, 17:37

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
Ü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
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 Very Happy
_________________
Kommunikation ist nur unter gleichen möglich
//by Hackbard Celine
 
krallistic_
Newbie
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?
 
The-God-of-all_
Poster
Poster

Anmeldedatum: 20.05.2007
Beiträge: 170
Wohnort: App.Path


Verfasst am: 04.12.2007, 16:31

Nein .count gibt aus wieviele Winsocks im Array sind, egal welchen Status sie haben.
_________________


 
Fuka_
Coder
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^^

MfG =)
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Texte und Ebooks

Tags: winsock array, programmieren, arrays

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 796 20.05.2002, 00:28
Keine neuen Beiträge Eine kleine Frage an euch.. 906 30.09.2007, 08:57
Keine neuen Beiträge TopMost Funktion unter DirectX 921 27.07.2007, 10:48
Keine neuen Beiträge Wie Funktion nutzen ? 1101 29.06.2007, 20:59
Keine neuen Beiträge update funktion einbauen 1341 28.01.2007, 23:11
 



[ Time: 0.3707s ][ Queries: 117 (0.0329s) ][ GZIP on - Debug on ]