vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: HTML/Internet/Netzwerk · Winsock   |   VB-Versionen: VB4, VB5, VB611.08.05
Port forwarding

Dieser Tipp zeigt, wie man mit dem Winsock-Control Ports forwarden (weiterleiten) kann.

Autor:   Kilian MeyerBewertung:  Views:  15.385 
www.firewall-vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Dieser Tipp zeigt, wie man mit dem Winsock-Control Ports forwarden (weiterleiten) kann. Auch kann man damit bestehende Protokolle (POP3, SMTP, IRC, ...) erforschen, um sie aus eigenen Anwendungen heraus zu probieren. Um etwa das POP3-Protokoll zu erforschen gibt man als Listen-Port 110 an. Unter "Connect to" als Port 110 und als Server den eigenen POP3-Server. Man startet den Service und stellt im Mailclient die IP-Adresse des POP3 Server auf "127.0.0.1" oder auch "localhost" ein. Nun empfängt man standardmäßig über den Mailclient seine E-Mails und kann dann das Protokoll im Log-Fenster nachvollziehen. Auf diese Weise kann man auch das IRC-Protokoll "ausspionieren" um seinen eigenen IRC-Bot zu schreiben.

Der eigentliche Einsatz des Portforwardings bleibt allerdings einen Port auf einem Computer zu öffnen und alle Verbindungen an einen anderen Computer und/oder einen anderen Port weiterzuleiten. Möchte man etwa einen Server, der in einem Firmen- oder Heimnetzwerk auf einem Client-Rechner liegt, von außerhalb ansprechen, so installiert man auf dem Netzwerk-Server den Portforwarder und lässt den gewünschten Port an die Netzwerk-IP weiterleiten.

Genau das selbe wird bei der Linux-Firewall mit dem Befehl "iptables -t nat -A PREROUTING ..." erreicht.

Benötigt werden zwei Winsock-Controls (wsckSend und wsckListen), ein Commandbutton (Command1), eine ListBox (List1) sowie 5 Textfelder (Text1 bis Text5).

Option Explicit
 
Dim bConnected As Boolean
Dim bSendComplete1 As Boolean
Dim bSendComplete2 As Boolean
' ### Laden der Form ###
Private Sub Form_Load()
  ' Vorbereiten der Variablen
  bConnected = False
  bSendComplete1 = True
  bSendComplete2 = True
End Sub
' ### Starten/Beenden des Vorgangs ###
Private Sub Command1_Click()
  If bConnected = False Then
    ' Starten des Services
    wsckListen.Close
    wsckSend.Close
 
    wsckListen.LocalPort = Text2.Text
    wsckListen.Listen
 
    Command1.Caption = "Stop Service"
    List1.Clear
 
    bConnected = True
  Else
    ' Stoppen des Services
    Call SetStatus("Closing Connection . . .")
 
    wsckListen.Close
    wsckSend.Close
 
    Call SetStatus("Connection closed!")
    bConnected = False
 
    Command1.Caption = "Start Service"
  End If
End Sub
' ### Statusanzeige setzen ###
Public Function SetStatus(ByVal sText As String)
  ' Die Statusanzeige schreiben
  List1.AddItem "[" & Format(Time(), "hh:mm:ss") & "] " & sText
End Function
' ### Beim Click auf die Status-Liste ###
Private Sub List1_Click()    
  ' Anzeigen des Status-Textes
  With List1
    If .ListIndex >=0 Then  
      Text5.Text = .List(.ListIndex)
    End If
  End With
End Sub
' ### Bei einem Verbindungsaufbau an den Listen-Port ###
Private Sub wsckListen_ConnectionRequest(ByVal requestID As Long)
  If wsckListen.State <> sckClosed Then
    wsckListen.Close
 
    ' Status setzen
    Call SetStatus("Client is connecting . . .")
    Call SetStatus("Connecting to Server . . .")
 
    ' Verbindung zum Weiterleiten öffnen
    wsckSend.RemoteHost = Text4.Text
    wsckSend.RemotePort = Text3.Text
    wsckSend.Connect
 
    ' Überprüfen ob die Verbindung zum Server hergestellt wurde
    Do While wsckSend.State <> sckConnected
      DoEvents
    Loop
    Call SetStatus("Connected to Server successfully!")
 
    ' Annehmen der Verbindung
    wsckListen.Accept requestID
 
    ' Überprüfen ob die Verbindung zum Client hergestellt wurde
    Do While wsckListen.State <> sckConnected
      DoEvents
    Loop
    Call SetStatus("Connected to Client successfully!")
 
    bConnected = True
  End If
End Sub
' ### Beim Empfangen vom Client ###
Private Sub wsckListen_DataArrival(ByVal bytesTotal As Long)
  Dim sData As String
 
  ' Empfangene Daten in Variable speichern
  Call wsckListen.GetData(sData, vbString)
 
  If wsckSend.State = sckConnected Then
    ' Warten bis alle Daten an den Server geleitet wurden
    Do While bSendComplete1 = False
      DoEvents
    Loop
 
    ' Status setzen
    Call SetStatus("|-> " & sData)
 
    ' Senden der Daten an den Server
    bSendComplete1 = False
    wsckSend.SendData sData        
  End If
End Sub
' ### Beim Empfangen vom Server ###
Private Sub wsckSend_DataArrival(ByVal bytesTotal As Long)
  Dim sData As String
 
  ' Empfangene Daten in Variable speichern
  Call wsckSend.GetData(sData, vbString)
 
  If wsckListen.State = sckConnected Then
    ' Warten bis alle Daten an den Server geleitet wurden
    Do While bSendComplete2 = False
      DoEvents
    Loop
 
    ' Status setzen
    Call SetStatus("|<- " & sData)
 
    ' Senden der Daten an den Server
    bSendComplete2 = False
    wsckListen.SendData sData        
  End If
End Sub
' ### Wenn das Senden an den Server vollendet ist ###
Private Sub wsckListen_SendComplete()
  ' Variable setzen
  bSendComplete2 = True
End Sub
' ### Wenn das Senden an den Clienten vollendet ist ###
Private Sub wsckSend_SendComplete()
  ' Variable setzen
  bSendComplete1 = True
End Sub



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.