Rubrik: HTML/Internet/Netzwerk · Winsock | VB-Versionen: VB4, VB5, VB6 | 17.12.02 |
Datenpakete getrennt verschicken und empfangen Ein Beispiel, wie man mehrere Pakete an einen Client schicken kann - ohne dass der Client das ganze als ein Paket empfängt. | ||
Autor: Wolfgang Christ | Bewertung: | Views: 19.499 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Vielleicht kennen Sie das ja: Sie haben eine Client / Server Anwendung geschrieben, doch wenn der Server zwei voneinander getrennte Pakete verschickt, kommen diese auf der Clientseite wie ein Paket an (umgekeht natürlich genauso).
Warum das so ist - keine Ahnung. Hierbei handelt es sich aber nicht nur um ein Windowsproblem. Dieses Problem tritt auch in anderen Betriebssystemen auf.
Wenn man nun vor jedes Paket die Länge setzt und dann die zusammengefügten Pakete wieder trennt, kann die ganze Kommunikation so behandelt werden, wie Sie sich das ganze mühselig ausgedacht haben. Dies gilt übrigens als Standard unter Unix-basierenden Betriebssystemen.
Wenn "die" das können, dann können wir das ganze erst recht
Folgenden Code auf Client- und Serverseite verwenden und es funktioniert. Die Verarbeitung erfolgt dann in der Sub Verarbeite, das Versenden wird mit der Function WskSend realisiert.
Private Function WskSend(sData As String) As Boolean ' Daten an die Gegenstelle versenden ' Max. Länge überschritten ? If Len(sData) > 9999 Then ' Max. Länge überschritten! ' String kann nicht versandt werden WskSend = False Exit Function End If ' Vor jeden zu versendenden String die Länge setzen Winsock1.SendData Format$(Len(sData), "0000") & sData WskSend = True End Function
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Daten empfangen Dim sData As String Dim iLen As Integer ' String abholen Winsock1.GetData sData, vbString Do While Len(sData) > 0 ' Die ersten 4 Stellen sind als Länge definiert ' (sollte ausreichen) iLen = Val(Left(sData, 4)) ' String raustrennen und verarbeiten Verarbeite Mid(sData, 4, iLen) ' Verarbeiteten String entfernen sData = Trim(Right(sData & " ", Len(sData) - iLen + 4)) Loop End Sub
Private Sub Verarbeite(sData As String) ' ... hier wird der String programmspezifisch ' weiterverarbeitet End Sub