|
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
|
|
|
|
Um diesen Tipp ausführen zu können, muss das Microsoft Winsock
Control 6.0 (SP6) in das Projekt eingebunden werden.
|
|
|
|
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: [ 4135 ]
|
|
|