Programmieren - alles kontrollieren 4.937 Themen, 20.662 Beiträge

Verstehe Sourcecode nicht

torsten40 / 2 Antworten / Flachansicht Nickles

Hi,
ich hab mal von einem guten Bekannten (Programmierer) einen Source code bekommen.
Das ganze funktioniert auf dem Server Client Prinzip.
Ich hab das den Code nun ca 5 Jahre und bin immer noch am überlegen wie der das hinbekommen hat, bzw warum das Teil das macht was es macht. Ich checks einfach nicht.
Übertragen wird der komplette Arbeitsplatz, mit allen Partitionen und Laufwerken, nur ich weiuss nicht warum.
Den Up-Download hab ich mal rausgenommen, der sicherheit wegen ^^

------------------------------------------------
Client:
------------------------------------------------
Option Explicit

Private Sub Command1_Click()
If Winsock1.State sckClosed Then 'Falls Verbindung besteht (Irre klicken ja mehrmals auf Listen-Button)
Winsock1.Close 'dann schliessen vor dem...
End If
Winsock1.LocalPort = Val(Text1.Text) '...neuem festsetzen des Port auf text1 (val, da localport eine Zahl erwartet)
Winsock1.Listen ' und warten auf Action :)
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) 'Verbindungsanfrage vom Server
If Winsock1.State sckClosed Then 'Falls schon eine Verbindung besteht
Winsock1.Close '... vorher schliessen
End If
Winsock1.Accept requestID 'Verbindung zum Server akzeptieren und aufbauen
Command1.Enabled = False 'Button ausschalten, nun überflüssig
End Sub

Private Sub Command3_Click()
Winsock1.SendData "+#VU" 'Verzeichnis höher gehen (Befehl senden)
End Sub

Private Sub List1_Click()
Winsock1.SendData "+#DV" & List1.List(List1.ListIndex) 'Laufwerk wechseln (Befehl senden)
End Sub

Private Sub List2_Click()
Winsock1.SendData "+#VL" & List2.List(List2.ListIndex) 'Verzeichnis wechseln (Befehl senden)
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Dim befehl As String
Dim s As String
Dim t As Long

Winsock1.GetData data 'Daten holen

While Len(data) 'Solange Daten in Data sind alles wiederholen zwischen While...Wend

befehl = Left(data, 4) 'ersten 4 Zeichen sind immer Befehl
data = Mid(data, 5) ' ersten 4 Zeichen löschen aus data, diese liegen ja in befehl nun

If befehl = "+#CL" Then 'Listboxen leeren-Befehl?
List1.Clear: List2.Clear: List3.Clear
Else 'alle anderen Befehle

t = InStr(data, "+#") 'ist in data noch ein Befehl vorhanden? (Befehle fangen mit +# an)
'Instr liefert 0, wenn kein weiterer Befehl da ist

If t Then 'ja, weitere Befehle
s = Left(data, t - 1) 's enthält den Text bis zum nächsten Befehl in data
data = Mid(data, Len(s) + 1) 'daher nun data löschen bis zum nächsten Befehl
Else ' nein, kein Befehl mehr in data
s = data 'also ist s der Rest von data
data = "" 'Data löschen, sonst läuft while...wend ja ohne Ende
End If

'in s ist ja nun der Text...
Select Case befehl '...und diesen nun je nach Befehl zuordnen
Case "+#DR"
List1.AddItem s 'Laufwerksliste
Case "+#DI"
List2.AddItem s 'Verzeichnisliste
Case "+#FI"
List3.AddItem s 'Dateiliste
Case "+#VU"
Label1.Caption = s 'aktuellen Pfad anzeigen
End Select
End If

Wend
End Sub

---------------------------------------------------------------
Server:
---------------------------------------------------------------

Option Explicit

Private Sub Form_Load()
'Boxen ausschalten, wird ja vom Client gesteuert
Dir1.Enabled = False: Drive1.Enabled = False: File1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
Winsock1.Close 'Winsock schliessen bei Programmende
End Sub

Private Sub Command1_Click()
Winsock1.Connect Text1.Text, Val(Text2.Text) 'Verbindung aufbauen zu IP text1 über Port text2
End Sub

Private Sub Winsock1_Connect() 'Verbindung zu Client wurde aufgebaut
Command1.Enabled = False 'also Button deaktivieren
Senden ' und aktuelle Laufwerke + Pfad senden
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data As String

Winsock1.GetData data 'Daten holen
Select Case Left(data, 4) ' Befehl, also ersten 4 Zeichen von Data

Case "+#DV" 'Laufwerk gewechselt
Drive1.Drive = Mid(data, 5) 'Data, ab 5. Stelle ist das Laufwerk
Dir1.Path = Drive1.Drive 'Pfad auf Laufwerk setzen
File1.Path = Dir1.Path 'Dateien auf Pfad setzen
Senden 'und weg mit dem ganzen Mist

Case "+#VU" 'Verzeichnis höher gehen
Dir1.Path = Left(Dir1.Path, InStrRev(Dir1.Path, "\")) 'letztes Verzeichnis vom Pfad löschen
File1.Path = Dir1.Path ' Dateien auf Pfad setzen
Senden '... rate mal... klar, den Käse wieder senden

Case "+#VL" 'Verzeichnis geändert
Dir1.Path = Mid(data, 5) 'Data ab 5. Stelle enthält neues Verzeichnis (ersten 4 Stellen war ja der Befehl)
File1.Path = Dir1.Path 'Dateien natürlich auch wieder holen
Senden '.... *no-comment*

End Select
End Sub

Private Sub Senden()
Dim i As Long
Winsock1.SendData "+#CL" 'Befehl senden zum leeren der Listboxen auf dem Client
For i = 0 To Drive1.ListCount - 1 'Alle Laufwerke senden
Winsock1.SendData "+#DR" & Drive1.List(i)
Next i
For i = 0 To Dir1.ListCount - 1 'Alle Verzeichnisse senden
Winsock1.SendData "+#DI" & Dir1.List(i)
Next i
For i = 0 To File1.ListCount - 1 'Alle angezeigten Dateien senden
Winsock1.SendData "+#FI" & File1.List(i)
Next i
Winsock1.SendData "+#VU" & File1.Path 'Aktuellen Pfad senden (Label1-Anzeige auf Client)
End Sub

Downoad der Source:
http://biernot.silentz-productions.de/nickles/Remote_Laufwerke_01.rar

Warum macht das Program mit diesen ganzen +vd +hd +35453 usw, das was es macht?

Das Client/Server Prinzip hab ich schon verstanden, nur diese eine Source nicht!

Danke

Freigeist
bei Antwort benachrichtigen
Andreas42 torsten40 „Verstehe Sourcecode nicht“
Optionen

Hi!

Ich programmiere zwar nicht in .Net oder VisualBasic, aber das Prinzip, das dein Freund da nutzt ist eigentlich recht simpel. Er lässt ein Programm auf dem Server laufen und eines auf dem Client.

Der Weg, wie die Kommunizieren ist in der Theorie egal (die Sprechen offenbar über einen Port, der es ermöglicht einen String auszutauschen).

Das Programm auf dem Server wartet nun offenbar, bis der Client ein Befehl übermittelt (über diese Stringsenden Kommunikationsmöglichkeit). Dieser String beinhaltet ein Kommande Datenzu senden oder das Verzeichnis zu wechseln.
Das Serverprogramm wertet den Befehl aus, führt die passende Operation aus (z.B. Verzeichniswechsel) und sendet die benötigten Daten zurück.

Damit der Server wies, was der Client will, hat dein Freund einfach ein paar Befehle erfunden, z.B. +#DV, +#VU und +#VL

Wenn man nun im Client Program den Button "Eine Verzeichnis Ebene höher" klickt, dann sendet der Client den String "+#VU".

Der Server sitzt ja nun da und wartet, dass ein Kommandostring rein kommt. Er prüft nun die ersten vier Buchstaben. Findete r dort die Zeichenkette "+#VU", dann wechselt er in das Verzeichnis und sendet als Ergebnis den neuen Pfad an den Cient (wieder als String). Dabei benutzt er als Sendekennung wieder den String "+#VU".

Auf dem Client läuft ebenfalls ein Task, der auf solche Nachrichtenstrings vom Server wartet. Der Client wertet die Antwort aus und zeugt dann den neuen Pfad an.

Das ist eine schöne einfache Lösung zur Kommunikation zwischen zwei Programmen (und zum Datenaustausch).

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen