Mein Server hört auf dem Port 1234 für eingehende Verbindungen, ich machte eine Reihe von Sockets und ich bin durch dieses Array auf der Suche nach einem bereits freien Sockets (Closed = 0) durchgehen, die Erhöhung Array, um einen neuen eingehenden Sockets zu halten, wenn kein freier Socket im Sockets-Array verfügbar ist. Dies wird später der Index zu den Sockets sein, um jede Verbindung allein zu identifizieren. Nicht sicher, ob das ein guter Ansatz ist, aber es funktioniert gut und stabil, bis ich versuchte, meinen Server mit etwa 15 gleichzeitig geöffneten Clients zu stressen. Das Problem, mit dem ich konfrontiert bin, ist, dass einige der Client-Apps Verbindungs-Timeouts erhalten und der Server instabil wird, wenn er diese mehreren Verbindungen gleichzeitig verarbeitet. Ich sende nicht viel Daten nur 20 Bytes auf jedem Verbindungsereignis, das vom Server empfangen wird. Ich habe versucht, die Backlog Wert auf dem Anruf Call zu erhöhen, aber das hat auch nicht geholfen. Ich muss länger auf diese Clients warten, um eine Verbindung herzustellen. Aber sie verbinden sich schließlich. Und der Server antwortet später immer noch auf neue Verbindungen (Wenn ich zum Beispiel alle diese Client-Apps schließe oder eine neue Client-App öffne, wird sofort eine Verbindung hergestellt). Auch diese Verbindungen bleiben offen und ich schließe Socket nicht von der Client-Seite.Winsock 15 Verbindungen zur gleichen Zeit wird instabil
I CSocketPlus Klasse
Verbindungsanforderungsereignis bin mit
Private Sub Sockets_ConnectionRequest(ByVal Index As Variant, ByVal requestID As Long)
Dim sckIndex As Integer
sckIndex = GetFreeSocketIndex(Sockets)
Sockets.Accept sckIndex, requestID
End Sub
Function GetFreeSocketIndex(Sockets As CSocketPlus) As Integer
Dim i As Integer, blnFound As Boolean
If Sockets.ArrayCount = 1 Then 'First we check if we have not loaded any arrays yet (First connector)
Sockets.ArrayAdd 1
GetFreeSocketIndex = 1
ReDim UserInfo(1)
Exit Function
Else
'Else we loop through all arrays and find a free (Not connected one)
For i = 1 To Sockets.ArrayCount - 1
If Sockets.State(i) <> sckConnected Then
'Found one use it
blnFound = True
Sockets.CloseSck i
GetFreeSocketIndex = i
If UBound(UserInfo) < i Then
ReDim Preserve UserInfo(i)
End If
Exit Function
End If
Next i
'Didn't find any load one and use it
If blnFound = False Then
Sockets.ArrayAdd i
Sockets.CloseSck i
GetFreeSocketIndex = i
ReDim Preserve UserInfo(i)
End If
End If
End Function
Weiß jemand, warum zur gleichen Zeit gibt es ein Performance-Probleme, wenn mehrere Verbindungen auftreten? Warum reagiert der Server langsam?
Was lässt den Server schneller akzeptieren?
Ich habe auch versucht, die Verbindung nicht zu akzeptieren, dh nicht auf Anfrage bei Verbindungsanforderung Ereignis aufrufen, aber immer noch das gleiche Problem.
EDIT: Ich habe versucht, ein Debug-Variable setzt die Ausgabe von Socket-Nummer auf dem FD_ACCEPT Ereignis auf der CSocket Klasse zu drucken und es scheint, dass WndProc verzögert die Nachrichten im Fall eines schreiben Viele Verbindungen.