vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Re: Winsock - Server Client Verbindungsproblem 
Autor: Preisser
Datum: 13.11.09 00:07

Hallo,
also die Fehlermeldung kommt normalerweise dann, wenn man versucht, Daten zu senden, aber keine Verbindung besteht. Dies kann z. B. auftreten, wenn man die Connect-Methode des Winsocks aufruft und direkt danach Daten sendet, obwohl die Verbindung noch gar nicht hergestellt worden ist; oder eben wenn gar keine Verbindung hergestellt werden kann.
Das Winsock-Control stellt dafür Ereignisse wie Close, Connect, Error usw. bereit. Das Connect-Ereignis wird ausgeführt, sobald eine Verbindung hergestellt wurde, nachdem die Connect-Methode aufgerufen wurde. Das Close-Ereignis wird ausgeführt, wenn die Verbindung vom Gegenüber getrennt wurde. Error, falls ein Fehler auftrat und die Verbindung jetzt auf jeden Fall nicht mehr besteht. Was außerdem hier nützlich wäre, ist das SendComplete-Ereignis, das aufgerufen wird, wenn alle Daten beim Gegenüber abgekommen sind.

Versuche es mal so:
Server:
Private Sub cmdLoeschen_Click()
    txtOutput.Text = ""
End Sub
 
Private Sub Form_Load()
    Winsock1.LocalPort = "34"
    Winsock1.Listen
 
End Sub
 
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
  Winsock1.Close
  Winsock1.Accept requestID
End Sub
 
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim sData As String
 
  Winsock1.GetData sData
  txtOutput.Text = txtOutput.Text & sData & vbNewLine & vbNewLine
End Sub
 
Private Sub Winsock1_Close()
  Winsock1.Close
  Winsock1.Listen
End Sub
 
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _
  ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal _
  HelpContext As Long, CancelDisplay As Boolean)
  Winsock1.Close
  Winsock1.Listen
End Sub
Client:
Dim ServerIP As String
Dim ServerPort As String
 
Private Sub cmdSenden_Click()
    wsckClient.RemoteHost = ServerIP
    wsckClient.RemotePort = ServerPort
    wsckClient.Connect
    cmdSenden.Enabled = False
End Sub
 
Private Sub wsckClient_Connect()
    wsckClient.SendData txtInput.Text
End Sub
 
Private Sub wsckClient_OnSendComplete()
    wsckClient.Close
    cmdSenden.Enabled = True
End Sub
 
Private Sub wsckClient_Error(ByVal Number As Integer, Description As String, _
  ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal _
  HelpContext As Long, CancelDisplay As Boolean)
  wsckClient.Close
  cmdSenden.Enabled = True
  If wsckClient.State = 7 then
    MsgBox "Ein Fehler ist während der Datenübertragung aufgetreten."
  Else
    MsgBox "Ein Fehler ist beim Herstellen der Verbindung aufgetreten."
  End If
End Sub
 
Private Sub wsckClient_Close()
  wsckClient.Close
  cmdSenden.Enabled = True
End Sub
 
Private Sub Form_Load()
    ServerIP = "localhost"
    ServerPort = "34"
End Sub
Anmerkung:
Der Server hat nur 1 Winsock-Element, kann also nur eine Verbindung gleichzeitig annehmen. Das bedeutet, solange der Server eine Verbindung von einem anderen Client angenommen hat und diese Verbindung besteht (oder der Server zumindest glaubt, sie bestehe noch) kann kein anderer Client mehr eine Verbindung herstellen. Das könnte zu Problemen führen, wenn durch Netzwerk-/Internetverbindungsprobleme die Verbindung unterbrochen wurde. Beim Client wird meistens nach kurzer Zeit ein Error-Ereignis des Winsocks ausgelöst, beim Server in vielen Fällen jedoch nicht, d. h. er merkt nicht, dass der Client gar nicht mehr da ist. Ich würde deshalb hier noch einen Timeout-Timer im Server einbauen, der z. B. nach 1 Min. Inaktivität die Verbindung trennt, sodass andere Clients sich wieder verbinden können.

Noch sicherer wäre es natürlich, ein Steuerelementfeld von Winsocks zu verwenden, und immer ein neues zu laden, wenn jemand eine Verbindung herstellen will. Falls gewünscht ist, dass sich wirklich nur 1 Client gleichzeitig verbinden kann (der sich dann evtl. authentifizieren muss), könnte man den Server ja so programmieren, dass er Verbindungen annimmt und sie nicht weiter beachtet; erst wenn sich ein Client authentifiziert hat, wird auf dieser Verbindung was gesendet und alle anderen verbundenen Clients werden raufgeworfen.

Beitrag wurde zuletzt am 13.11.09 um 00:19:49 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Winsock - Server Client Verbindungsproblem1.492SirSkydancer09.11.09 11:27
Re: Winsock - Server Client Verbindungsproblem844Preisser13.11.09 00:07
Re: Winsock - Server Client Verbindungsproblem780SirSkydancer13.11.09 01:34

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel