Mir ist gerade noch aufgefallen, dass ich im Code des Servers eine Zeile vergessen hatte, was dazu führen kann, dass alle 30. Sekunden (wenn eine leere Zeichenfolge zur Verbindungserhaltung gesendet wird) ein Überlauffehler im DataArrival-Ereignis auftreten und dadurch ein Datenpaket verloren gehen könnte, wenn 2 Pakete direkt hintereinander gesendet werden. Das DataArrival-Ereignis des Servers müsste korrekterweise so aussehen:
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strTemp As String, arrTemp() As Byte, lngTemp As Long
On Error GoTo WsockErr
Winsock1(Index).GetData arrTemp, vbArray + vbByte
strTemp = arrTemp
WSocks.WsockClients(Index).sWsockZwischenspeicher = WSocks.WsockClients( _
Index).sWsockZwischenspeicher & strTemp
WSocks.WsockClients(Index).TimerLeerlaufZaehler = 0
If WSocks.WsockClients(Index).nGesamtlaengePaket > 0 Then
MidB$(WSocks.WsockClients(Index).sPaketZwischenspeicher, _
WSocks.WsockClients(Index).nBereitsUebertragenPaket + 1) = MidB$( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 1, WSocks.WsockClients( _
Index).nGesamtlaengePaket - WSocks.WsockClients( _
Index).nBereitsUebertragenPaket)
lngTemp = LenB(MidB$(WSocks.WsockClients(Index).sWsockZwischenspeicher, 1, _
WSocks.WsockClients(Index).nGesamtlaengePaket - WSocks.WsockClients( _
Index).nBereitsUebertragenPaket))
WSocks.WsockClients(Index).nBereitsUebertragenPaket = WSocks.WsockClients( _
Index).nBereitsUebertragenPaket + lngTemp
WSocks.WsockClients(Index).sWsockZwischenspeicher = MidB( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 1 + lngTemp)
If WSocks.WsockClients(Index).nGesamtlaengePaket = WSocks.WsockClients( _
Index).nBereitsUebertragenPaket Then
WSocks.WsockClients(Index).nGesamtlaengePaket = 0
If Not WSocks.WsockClients(Index).sPaketZwischenspeicher = "" Then _
Winsock1DatenEmpf Index, WSocks.WsockClients( _
Index).sPaketZwischenspeicher
End If
End If
Do While LenB(WSocks.WsockClients(Index).sWsockZwischenspeicher) >= 4 And _
WSocks.WsockClients(Index).nGesamtlaengePaket = 0
WSocks.WsockClients(Index).nGesamtlaengePaket = CLng(AscB(MidB( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 1, 1))) * 256& * 256& * _
256& + CLng(AscB(MidB(WSocks.WsockClients(Index).sWsockZwischenspeicher, 2, _
1))) * 256& * 256& + CLng(AscB(MidB(WSocks.WsockClients( _
Index).sWsockZwischenspeicher, 3, 1))) * 256& + CLng(AscB(MidB( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 4, 1)))
If WSocks.WsockClients(Index).nGesamtlaengePaket > 100000000 Then GoTo _
WsockErr 'Datenpakete > 100 MB ignorieren
WSocks.WsockClients(Index).nBereitsUebertragenPaket = 0
If Not WSocks.WsockClients(Index).nGesamtlaengePaket = 0 Then
WSocks.WsockClients(Index).nBereitsUebertragenPaket = LenB(MidB$( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 5, _
WSocks.WsockClients(Index).nGesamtlaengePaket))
WSocks.WsockClients(Index).sPaketZwischenspeicher = StringB( _
WSocks.WsockClients(Index).nGesamtlaengePaket, ChrB(0))
MidB$(WSocks.WsockClients(Index).sPaketZwischenspeicher, 1) = MidB$( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 5, _
WSocks.WsockClients(Index).nGesamtlaengePaket)
End If
WSocks.WsockClients(Index).sWsockZwischenspeicher = MidB$( _
WSocks.WsockClients(Index).sWsockZwischenspeicher, 5 + _
WSocks.WsockClients(Index).nBereitsUebertragenPaket)
If WSocks.WsockClients(Index).nGesamtlaengePaket = WSocks.WsockClients( _
Index).nBereitsUebertragenPaket Then
WSocks.WsockClients(Index).nGesamtlaengePaket = 0
If Not WSocks.WsockClients(Index).sPaketZwischenspeicher = "" Then _
Winsock1DatenEmpf Index, WSocks.WsockClients( _
Index).sPaketZwischenspeicher
End If
Loop
Exit Sub
WsockErr:
WSocks.WsockClients(Index).nGesamtlaengePaket = 0
WSocks.WsockClients(Index).sWsockZwischenspeicher = ""
End Sub
Beitrag wurde zuletzt am 04.07.09 um 18:49:02 editiert. |