2016-06-30 3 views
0

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.

Antwort

0

Ok das Problem scheint von meiner Verbindung zu sein. Ich habe meinen Server zu meinem RDP bewegt, der 250Mbps Download-Geschwindigkeit mit 200Mbps Upload-Geschwindigkeit hat und es scheint dort sehr gut zu funktionieren. Getestet mit 100 Client eine Verbindung hergestellt und jeder von ihnen sofort verbunden !. Frage mich, warum ich solche Probleme habe, wo meine Heimverbindung 40/40 Mbps ist ... hmmm. Wer weiß, warum das passiert?

Edit: Scheint die Router-Option zu sein!

Firewall aktivieren
aktivieren DoS-Schutz

Disabled die Firewall (nur für Testzwecke) und alles funktioniert einwandfrei!

Also im Grunde denkt der Router, dass es eine Art DOS-Angriff gibt. So wird es den Verkehr verlangsamen.

Verwandte Themen