Das Winsock Control
von Stefan Moosbauer
Ü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 Stefan Moosbauer
Inhalt
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.