Die Community zu .NET und Classic VB.
Menü

Das Winsock Control

 von 

Übersicht 

Heutzutage verwenden viele Anwendungen die Möglichkeit das Internet zu benutzen. Um diesen Service in eigenen Programmen auch zu benützen habe ich dieses Tutorial verfasst. Es beschäftigt sich hauptsächlich mit dem Winsock - Steuerelement, die einfachste Möglichkeit Informationen über das Internet auszutauschen!

Mit freundlichen Grüßen
Stefan Moosbauer

Winsock  

Bevor das eigentlichem Tutorial über das Winsock - Steuerelement anfängt, folgt zuerst eine kleine Lehre über das Internet:

Im Internet hat jeder PC eine Anschlussnummer, die als IP (=Internet-Protokoll) bezeichnet wird. Ein IP-Adresse ist 32Bit lang und hat das format ****.****.****.****, dabei entspricht jeder Wert einer Zahl im Bereich 0 - 255. Ein Provider vergibt (meistens) jedes Mal, wenn sich der User neu einwählt eine neue IP-Adresse. Da man sich die Zahlen der IP Adressen so schlecht merken kann, fing man an, IP Adressen Namen zu vergeben. Diese Technik nennt man Domänennamen. Eine zulässige Domäne ist z.b. http://www.activevb.de; dabei ist das .de die Top-Level Domäne oder Domäne höchster Ebene. Ander Top-Level Domains sind z.B.: .edu für education , .gov für government, .com für commercial, .NET für network, .org für organisation usw...

www steht für world-wide-web; http (HyperText Transfer Protocol) ist das im Internet verwendete Protokoll um sich Site/Pages anzusehen.

Da alle Information, die über das Internet versendet werden, eine gültige IP-Adresse verwenden müssen, muss es auch einen Prozess geben eine Domäne in eine IP Adresse umzuwandeln. Diesen Prozess nennt man Domain Name Server (DNS). Wenn ihr PC mit dem Internet verbunden ist, dann hat er für den DNS entweder eine feste IP Adresse oder bekommt von ihrem Provider eine dynamische zugewiesen.

Um Informationen über das Internet auszutauschen, genügt es nicht, zu wissen wie die IP des Remotes (des anderen PCs) ist. Einige Dienste im Internet stellen mehrer Services zur Verfügung. Daher muss es eine Möglichkeit geben, wie man mehrer Anwendungen auf einem PC mit einer IP Adresse laufen lassen kann. Das geschieht über Anschlussnummern (engl. Ports) Eine Anschlussnummer ist einfach eine weitere Adresse, die sich auf den jeweiligen PC bezieht. Anschlussnummern können Nummern von 0 bis 65.535 verwenden. So gibt es für die verschiedenen Protokolle reservierte Anschlussnummern, z.B.: für das http- Protokoll den Port 80. Im Laufe der Jahre haben sich die Benutzer auf jeweilige Protokolle geeinigt. Um z.B.: ein HTML Dokument abzurufen, verwendet man das http - Protokoll. Weiter:

Port Name Beschreibung
13 Daytime Datum/Uhrzeit Protokoll
20 ftp-data FTP(File-Transfer-Protocoll);darüber werdenDateien zw. Systemen ausgetauscht
21 ftp FTP, Steueranschluss
23 Telnet Telnet- Stellt einen Terminal Zugriff auf einem Remote-PC zur Verfügung
25 smtp SMTP(Simple Mail Transport Protocol)- Überträgt E-mail nachrichten zw. Systemen
37 Time Zeitprotokoll
53 Domain DNS- Konvertiert einen Domänennamen in eine IP-Adresse
79 Finger Finger-Protokoll - Gibt Informationen über einen Remote-Computer oder einen remote Anwender zurück
80 www-http WWW, http - Ruft Dokumente im HTML Format ab
110 Pop3 POP3 (Post office Protocol) - ruft E-Mail-nachrichten ab
119 nntp NNTP (Network News Transport Protocol) ruft News Artikel ab

Protokolle dienen den PC dazu, Informationen bei einem andern PC anzufordern und dessen Antwort auch zu verstehen. Protokolle sind in erster Linie gut dokumentierte Befehlsketten und eine reihe zulässiger Antworten. Alle Protokolle basieren auf dem TCP oder UDP Protokoll

  • TCP steht für Transmission Control Protocol und erstellt eine virtuelle Verbindung zw. zwei PCs.
  • UDP steht für User Datagram Protocol. Dies ist eine Verbindungsloses Protokoll, das eine nachricht von einem PC zu dem anderen sendet ohne Garantie dass es auch wirklich ankommt.

Ein wichtiger Unterschied zw. TCP und UDP besteht darin, dass TCP eine bestehende verbindung zu einem PC braucht um Daten zu senden, während UDP das nicht braucht.

So jetzt genug gelehrt ;) Jetzt kommen wir zum eigentlichem Thema: das Winsock Steuerelement. Winsock ist eine Name, der aus Windows Sockets entstanden ist. Es ist eine ActiveX Komponente von Microsoft und auf der Toolbar mit einem rechten Mausklick unter Komponenten "Microsoft Winsock Control" einzufügen. Mit Winsock ist es möglich, sich mit einem anderen PC zu verbinden (Client/Server) oder auf einen Verbindung zu warten (Server/Client). Wir halten uns auf das Sprichwort "learning by doing" und zögern nicht lange. Da fast alle Anwendungen nur das TCP Protokoll unterstützen (darunter auch diejenigen, die zusätzlich UDP unterstützen) verwenden wir diesen Protokoll.

Mit dem Eigenschaften des Winsock - Steuerelementes könne sie die Socket Verbindung konfigurieren:

Eigenschaft Beschreibung
BytesReceived Gibt die Anzahl der Bytes im Empfangpuffer wieder.
LocalHostName Gibt den Namen des lokalen PCs wieder.
LocalPort Gibt die Anschlussnummer, die verwendet wird, wieder.
Protocol Gibt entweder TCP oder UDP an.
RemoteHostIP Gibt die IP - Adresse des Remotes wieder.
RemoteHost Gibt den Namen des Remotes wieder.
RemotePort Gibt die verwendete Anschlussnummer des Remotes wieder.
SocketHandle Gibt einen Verweiß auf die darunterliegende Winsock - API - Zugriffsnummer wieder.
State Gibt den Status des Steuerelements an.

*Achtung: Die Eigenschaft enthalt gegebenenfalls die Netzwerk IP Adresse nicht den Internet IP!

Die Eigenschaft State gibt den aktuellen Status über die Verbindung an. Sie kann folgende Werte haben:

Status Wert Beschreibung
SckClosed 0 Der Socket ist geschlossen
SckOpen 1 Der Socket ist geöffnet
SckListening 2 Der Socket ist empfangsbereit
SckConnectionPending 3 Die Verbindung wird aufgebaut
SckResolvingHost 4 Der Remote-Host-Name wird in eine IP-Adresse umgewandelt
SckHostResolve 5 Der Remote-Host-Name wurde in eine IP-Adresse umgewandelt
SckConnecting 6 Der Socket verbindet sich zu dem Remote
SckConnected 7 Der Socket hat sich zu dem Remote verbunden
SckClosing 8 Der Remote hat die Verbindung getrennt
SckError 9 Ein Fehler ist aufgetreten

Die Eigenschaften LocalHostName und LocalIP sind schreibgeschützt und können nicht verändert werden. Die IP Adresse kann nur vom Provider geändert werden!

Mit der Eigenschaft RemoteHostIP kann die IP Adresse des Remotes angegeben werden. RemoteHostName kann auch einen Domänennamen beinthalten,Winsock wandelt ihn selbstständig in eine IP Adresse um!

Server/Client:
Um eine Server(Zuhörer)/Client(Verbinder) zu entwickeln, müssen folgende Schritte beachtet werden:

Server:

  • Ein Port muss reserviert werden
  • Der RemotePort muss definiert werden
  • Eine Verbindung muss Aktzeptiert werden

Client:

  • Der RemoteIP muss eingegeben werden
  • Die Connect-Methode (Events) muss ausgelöst werden
  • Eine Verbindung muss Aktzeptiert werden

Folgende Methoden umfasst das Winsock Steuerelement:

Methode[Event] Beschreibung
Accept Akzeptiert eine Anfrage im Connection_Request Ereignis
Bind Wählt den lokalen Netzwerk-Adapter und die lokale Anschlussnummer aus
Close Schließt das Socket
Connect Baut eine TCP-Verbindung zu dem Remote auf
GetData Empfängt die Daten aus dem Empfangsbuffer und leert ihn
Listen Wartet auf eine Verbindung
PeekData Empfängt Daten von dem Empfangspuffer, leert ihn aber nicht
SendData Sendet Daten auf den Remote

Die Listen Methode funktioniert nur beim TCP-Protokoll. Die Methode wartet, bis sich jemand verbindet und löst dann das Connection_Request Ereignis aus. Mit Accept und der aktuellen requestID steht die Verbindung dann. Die Connect Methode ist ebenfalls für das TCP-protokoll gedacht, mit dem eine Verbindung aufgebaut werden kann. Sobald die Verbindung erstellt ist, löst sich das Ereignis Connect aus.

Die Ereignisse auf einen Blick:

Event Beschreibung
Close Wird ausgelöst, wenn der Remote eine TCP Verbindung trennt
Connect Wird ausgelöst, wenn eine Verbindung zum Server hergestellt ist
ConnectionRequest Wird ausgelöst, wenn sich eine Verbindung anbahnt
DataArrival Wird ausgelöst, wenn vom Remote Daten empfangen werden
Error Wird ausgelöst, wenn eine Fehlerbediendung eintritt
SendComplete Wird ausgelöst, wenn die Datenübertragung zum Remote abgeschlossen ist
SendProgress Wird periodisch während einer Datenübertragung ausgelöst

Ein kleines Beispiel  

So jetzt folgen wir dem Sprichwort "learning by doing", ein kleines Beispiel:

Der Server:

  Option Explicit
  
  Private Sub Command1_Click()
   'winsock wird geschlossen
    Winsock1.Close

   'Der Port für den Server wird definiert
    Winsock1.LocalPort = Text1.Text

   'Server wartet auf einen Verbindung
    Winsock1.Listen
   
    Command1.Enabled = False
  End Sub

  Private Sub Command2_Click()
   'Chat
    Text3.Text = Text3.Text & "Server: " & Text4.Text & vbCrLf

    Text3.SelStart = Len(Text3.Text)

   'Ein Befehl plus Text werden gesendet
    Winsock1.SendData "msg" & Text4.Text
  End Sub

  Private Sub Timer1_Timer()
   'Label1 gibt den Status wieder
    Label1.Caption = Winsock1.State
  End Sub

  Private Sub Winsock1_Close()
    Text4.Enabled = False
    Command2.Enabled = False
    Command1.Enabled = True
  End Sub

  Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
   'Winsock wird geschlossen da es noch
   'auf verbindungen wartet
    Winsock1.Close

   'Eine Verbindung wird akzeptiert
    Winsock1.Accept requestID
 
    Text4.Enabled = True
    Command2.Enabled = True
  End Sub

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

   'Die Variable result gibt die empfangenen Daten wieder;
   'Entweder die variable Result muss als String dim. werden
   'oder bei Winsock1.GetData Result muss hinten vbstring
   'dazugeschrieben werden
    Winsock1.GetData Result

   'Befehlauswertung
    Select Case Left(Result, 3)
   'Chat Befehl
    Case "msg"
      Text3.Text = Text3.Text & "Client: " & Mid(Result, _
                   4) & vbCrLf

      Text3.SelStart = Len(Text3.Text)
    End Select
  End Sub

Der Client

Option Explicit

Private Sub Command1_Click()
 'Winsock wird geschlosse
  Winsock1.Close
 
 'Die IP des Servers
  Winsock1.RemoteHost = Text1.Text
 
 'Der Port des Servers
  Winsock1.RemotePort = Text2.Text

 'Verbinde Winsock !
  Winsock1.Connect
 
  Command1.Enabled = False
End Sub<br />

Private Sub Command2_Click()
  Text3.Text = Text3.Text & "Client: " & Text4.Text _
               & vbCrLf
  
  Text3.SelStart = Len(Text3.Text)
  
 'Ein Befehl plus Text werden gesendet
  Winsock1.SendData "msg" & Text4.Text
End Sub

Private Sub Timer1_Timer()
 'Label1 gibt den Status wieder
  Label1.Caption = Winsock1.State
End Sub

Private Sub Winsock1_Close()
  Text4.Enabled = False
  Command2.Enabled = False
  Command1.Enabled = True
End Sub

Private Sub Winsock1_Connect()
  Text4.Enabled = True
  Command2.Enabled = True
End Sub

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

 'Die Variable result gibt die empfangenen Daten wieder;
 'Entweder die variable Result muss als String dim. werden
 'oder bei Winsock1.GetData Result muss hinten vbstring
 'dazugeschrieben werden

  Winsock1.GetData Result

  Select Case Left(Result, 3) 'Befehlsauswertung
    Case "msg" 'Chat Befehl
      Text3.Text = Text3.Text & "Server: " & Mid(Result, _
                   4) & vbCrLf

      Text3.SelStart = Len(Text3.Text)
    End Select
End Sub

Projekt als Download [65600 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.