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. |