Tipp 0330 Winsock (UDP) - 2 PC's verbinden
Autor/Einsender:
Datum:
  Alexander Csadek
20.04.2003
Entwicklungsumgebung:   VB 6
Um zwei PC's, egal ob im eigenen Heim-Netzwerk oder über das Internet zu verbinden, bedarf es nicht viel. Ein Winsock-Steuerelement für den Server/Host und eines für den Client, ein paar Zeilen Code und schon können sich die beiden PC's Nachrichten schicken.
Benötigt wird dazu das Steuerelement "Microsoft Winsock Control 6.0", das dem Projekt unter Komponenten hinzugefügt wird.
Da nur zwei PC's miteinander verbunden werden, braucht man nicht viel zu programmieren und verwendet hierfür am einfachsten das UDP-Protokoll (User Datagram Protocol). Dabei braucht man den Server/Host nicht auf Listen zu stellen und der Client braucht auch kein ConnectRequest schicken.
Der Server/Host wird mit dem Winsock-Befehl Bind und der gewünschten Port-Nummer gestartet. Auf der anderen Seite wird der Client eingestellt. Am einfachsten man nimmt für den lokalen Port die gleiche Nummer und stellt diese auch beim RemotePort ein. Dann muss man nur noch die IP-Adresse des Servers/Host setzen.
Sobald nun der Client eine Nachricht an den Server/Host schickt, steht die Verbindung.
Mit dem Winsock-Befehl SendData werden Nachrichten verschickt und das Winsock-Ereignis DataArrival teilt uns mit, dass eine Nachricht eingegangen ist.
In diesem Beispiel wurden Header-Nummern für die Nachrichten verwendet. Dies hilft um die verschiedenen Nachrichtenarten auseinander zu halten.
 
Option Explicit

Dim SindWirDerServer As Boolean

Private Const HDR_CONNECT As Integer = 1111
Private Const HDR_CLOSE As Integer = 1112
Private Const HDR_MESSAGE As Integer = 1113

Private Sub cmd_StartClient_Click()
  wskClient.LocalPort = CLng(txt_Port.Text)
  wskClient.RemoteHost = txt_IP.Text
  wskClient.RemotePort = CLng(txt_Port.Text)
  wskClient.SendData HDR_CONNECT & "Client"
  cmd_StartClient.Enabled = False
  cmd_StartServer.Enabled = False
End Sub

Private Sub cmd_StartServer_Click()
  wskServer.Bind CLng(txt_Port.Text)
  SindWirDerServer = True
  cmd_StartClient.Enabled = False
  cmd_StartServer.Enabled = False
End Sub

Private Sub cmd_Senden_Click()
  If SindWirDerServer Then
    If wskServer.State = sckOpen Then
      skServer.SendData HDR_MESSAGE & txt_Senden.Text
    End If
  Else
    If wskClient.State = sckOpen Then
      wskClient.SendData HDR_MESSAGE & txt_Senden.Text
    End If
  End If
End Sub

Private Sub wskClient_DataArrival(ByVal bytesTotal As Long)
  Dim hlpString As String

  wskClient.GetData hlpString, vbString
  Select Case CInt(Mid(hlpString, 1, 4))
    Case HDR_CONNECT
      lbl_IncomingText(1).Caption = "Verbindung hergestellt"
    Case HDR_CLOSE
      MsgBox "Server hat Verbindung abgebrochen."
      wskClient.Close
      cmd_StartClient.Enabled = True
      cmd_StartServer.Enabled = True
    Case HDR_MESSAGE
      lbl_IncomingText(1).Caption = Mid(hlpString, 5)
  End Select
End Sub

Private Sub wskServer_DataArrival(ByVal bytesTotal As Long)
  Dim hlpString As String

  wskServer.GetData hlpString, vbString
  Select Case CInt(Mid(hlpString, 1, 4))
    Case HDR_CONNECT
      lbl_IncomingText(1).Caption = "Verbindung hergestellt"
      wskServer.SendData HDR_CONNECT & "Server"
    Case HDR_CLOSE
      MsgBox "Client hat Verbindung abgebrochen."
      wskServer.Close
      SindWirDerServer = False
      cmd_StartClient.Enabled = True
      cmd_StartServer.Enabled = True
    Case HDR_MESSAGE
      lbl_IncomingText(1).Caption = Mid(hlpString, 5)
  End Select
End Sub

Private Sub Timer1_Timer()
  Dim lngAktuellerStatus As Long

  If SindWirDerServer Then
    lngAktuellerStatus = wskServer.State
  Else
    lngAktuellerStatus = wskClient.State
  End If

  Select Case lngAktuellerStatus
    Case sckClosed
      lbl_WinsockStatus(1).Caption = "Socket closed"
    Case sckOpen
      lbl_WinsockStatus(1).Caption = "Socket open"
    Case sckListening
      lbl_WinsockStatus(1).Caption = "Listening..."
    Case sckConnectionPending
      lbl_WinsockStatus(1).Caption = "Connection pending"
    Case sckResolvingHost
      lbl_WinsockStatus(1).Caption = "Resolving host..."
    Case sckHostResolved
      lbl_WinsockStatus(1).Caption = "Host resolved"
    Case sckConnecting
      lbl_WinsockStatus(1).Caption = "Connecting..."
    Case sckConnected
      lbl_WinsockStatus(1).Caption = "Connected"
    Case sckClosing
      lbl_WinsockStatus(1).Caption = "Closing..."
    Case sckError
      lbl_WinsockStatus(1).Caption = "Error"
  End Select
End Sub

Private Sub cmd_Beenden_Click()
  cmd_Disconnect_Click
  Unload Me
  End
End Sub

Private Sub cmd_Disconnect_Click()
  On Error GoTo ErrOut
  If SindWirDerServer Then
    If wskServer.State = sckOpen Then
      wskServer.SendData HDR_CLOSE & "Server"
    End If
    wskServer.Close
  Else
    If wskClient.State = sckOpen Then
      wskClient.SendData HDR_CLOSE & "Client"
    End If
    wskClient.Close
  End If
  cmd_StartClient.Enabled = True
  cmd_StartServer.Enabled = True
  Exit Sub

ErrOut:
  wskServer.Close
  wskClient.Close
  cmd_StartClient.Enabled = True
  cmd_StartServer.Enabled = True
End Sub
 
Hinweis
Um diesen Tipp ausführen zu können, muss das Microsoft Winsock Control 6.0 (SP6) in das Projekt eingebunden werden.
Weitere Links zum Thema
Multi-Player Spiele mit Winsock realisieren
MultiUser-Chat

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (3,9 kB) Downloads bisher: [ 4071 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Samstag, 17. September 2011