Thomas Füssl
 
  zurück      Startseite      Gästebuch      Kontakt 
  ©2003 by thfu - Mail an Webmaster   

Freeware

nach Themen:
 Internet
 Multimedia
 System
 Visual Basic

nach Kategorien:
 Programme
 VB-Bibliotheken
 VB-Sourcecode

Index:
 Alle Downloads
 Alle Artikel


Über...

 Sinn und Unsinn
 Gästebuch
 über mich


Partner-Link
EMails und 1 GB kostenloser Speicher bei
GMX

Partner-Link
Bücher bestellen bei
Amazon

 

Freeware
Programme

Mini-WebServer
kleinster Web-Server
VBTools
Werkzeuge für Visual Basic
KeyReMap
Tasten umbelegen
Exe/Bmp-PropertyPage
Eigenschaftsseite
VB-Setup
Setup-Programm
Registry-Tricks


VB-Bibliotheken


Apfel.Ocx
Apfelmännchenprogramm
RegExp.Dll
Reguläre Ausdrücke für VB
SerialID.Dll
Disk-Nummer r/w


VB-Sourcecode Tipps&Tricks


TCP/IP-Klassen
Rekursiv
MIME-Kodierung (base64)
Internet
MinMax
Format 8.3
Standard-Dialoge


Internet-Programmierung unter VB

Socket-Klasse

Beispiel-Code

TCP-Client

Um an einen TCP-Server Daten versenden zu können, muß man erstens seinen Rechnernamen ("dnsname") oder sein IP-Adresse ("xx.xx.xx.xx") kennen und zweitens wissen, an welchem Port er lauscht. Ein Web-Server lauscht z.B. in der Regel an Port 80.

'Socket deklarieren
Private WithEvents sck As Socket
Private answer$

'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
   Set sck = New Socket
End Sub

'Verbindung aufbauen, Daten versenden, Verbindung schließen
Sub xxx()
   sck.LineSeparator = vbCrLf 'optional, auch andere beliebige Trennzeichen möglich!
   sck.Connect host, port
   Do While sck.State = sockConnecting: WaitMessage: DoEvents: Loop
   If sck.State <> sockConnected Then Exit Sub 'Verbindung nicht möglich
   ...
   sck.SendData daten
   antwort$ = GetAnswer()
   ...
   sck.Disconnect
End Sub

'Ereignisse zum Datenempfang
Sub sck_DataArrival(BinData() As Byte, RemoteHostIP As String)
   ...
End Sub

Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
   answer$ = LineData
End Sub

Function GetAnswer() As String
   Do While Len(answer$) = 0: WaitMessage: Loop
   GetAnswer = answer$: answer$ = ""
End Sub

benötigt zusätzlich aus dem Download-Paket:
Socket.cls
Socket.bas

  • Das DataArrival-Ereignis tritt ein, wenn Daten eintreffen.
  • Das LineDataArrival-Ereignis tritt anstelle des DataArrival-Ereignisses ein, wenn die Eigenschaft LineSeparator ein Trennzeichen vorgibt und das Trennzeichen komplett empfangen wurde. Der LineData-Parameter enhält das Trennzeichen nicht mehr.

TCP-Server

Ein TCP-Server lauscht immer an einem bestimmten Port. Es ist natürlich entsprechend auf einem Rechner jeder Port zu einem Zeitpunkt nur von einem Server zu verwenden. Bei einer eingehenden Verbindung wird ein neuer Socket erstellt - dieser ist dann Peer-to-Peer mit dem Client verbunden.

'Socket deklarieren
Public WithEvents sck As Socket
Public Clients As New Collection

'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
   Set sck = New Socket
End Sub

'Server starten und stoppen
Sub StartServer()
   sck.LocalPort = port
   sck.Listen
End Sub

Sub StopServer()
   sck.Disconnect
End Sub

'eine Verbindung geht ein
Private Sub sck_ConnectionRequest()
   Dim conn As New MyConnection
   conn.Init sck, Me
   Clients.Add conn 'wichtig, damit VB die Referenz nicht entsorgt
End Sub

Behandlung einer eingehenden Verbindung innerhalb der Klasse MyConnection:

'Socket deklarieren
Private WithEvents sck As Socket
Private serverform As Form

'Socket-Instanz erstellen und konfigurieren
Private Sub Class_Initialize()
   Set sck = New Socket
   sck.LineSeparator = vbCrLf 'optional
End Sub

'Verbindung vom Server annehmen
Public Sub Init(server As Socket, svrform as Form)
   sck.Accept server
   Set serverform = svrform
End Sub

'Client hat Verbindung getrennt
Private Sub sck_Closed()
   Set sck = Nothing
   For n% = 1 To serverform.Clients.Count
      If serverform.Clients(n%) Is Me Then serverform.Clients.Remove n%: Exit For
   Next
End Sub

'vom Client empfangene Datn verarbeiten und Antwort senden
Private Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
   ...
   sck.SendData "antwort"
   'falls Sie hier sck.Disconnect aufrufen, dann auch sck_Closed aufrufen!
   ...
End Sub

benötigt zusätzlich aus dem Download-Paket:
Socket.cls
Socket.bas


UDP-Client

UDP ist verbindunglos, d.h. der Client sendet Pakete an den Server und weiss im folgenden nichts darüber. Eine Bestätigung für das Ankommen gibt es nicht! Eine Garantie, dass die Pakete in der gleichen Reihenfolge ankomme, wie sie gesendet wurden, gibt es auch nicht! Besonders für multimediale Anwendungen (Audio, Video) wird UDP aber häufig eingesetzt, da die Übertragung ohne den TCP-Protokoll-Overhead performanter ist und auf nicht angekommene Pakete sowie verzichtet werden kann. Desweiteren ist es möglich, Broadcast-Nachrichten an alle Teilnehmer eines (meist: des eigenen) Subnetzes zu senden.

sck.SendDataTo daten, host, port

  • Die Methoden sck.Connect und sck.Disconnect sind nicht notwendig, da per Definition verbindungslos.
  • Der Client kann nur Daten empfangen, indem er selbst als Server auftritt (denn es besteht ja keine Verbindung)!
  • Broadcast-Nachrichten: host="" (=lokales Broadcast) oder host="xx.xx.xx.255"

UDP-Server

Der UDP-Server funktioniert analog zur TCP-Variante, mit der Ausnahme, dass keine spezielle Klasse zur Beantwortung benötigt wird. Es kommen schließlich nur Pakete an, und es wird keine Peer-to-Peer-Verbindung aufgebaut.

'Socket deklarieren
Private WithEvents sck As Socket

'Socket-Instanz erstellen (z.B. in Form_Load)
Sub Form_Load()
   Set sck = New Socket
End Sub

'Server starten und stoppen
Sub StartServer()
   sck.Protocol = protocolUDP
   sck.LocalPort = port
   sck.LineSeparator = vbCrLf 'optional
   sck.Listen
End Sub

Sub StopServer()
   sck.Disconnect
End Sub

'Ereignisse zum Datenempfang
Sub sck_DataArrival(BinData() As Byte, RemoteHostIP As String)
   ...
End Sub

Sub sck_LineDataArrival(LineData As String, RemoteHostIP As String)
   ...
End Sub

  • vor dem Start des Servers das Protokoll einstellen: sck.Protocol = protocolUDP
  • Das Ereignis ConnectionRequest tritt nicht auf, sondern die Daten kommen direkt im Server-Socket per [Line]DataArrival-Ereignis an, daher auch beim Server-Socket ggf. die Eigenschaft LineSeparator einstellen!
  • Da (per Definition) keine Verbindung besteht, kann man im [Line]DataArrival-Ereignis auch nur per SendDataTo-Methode antworten!