Mon serveur est à l'écoute sur le port 1234 pour les connexions entrantes, je l'ai fait une série de prises et je suis Boucler dans ce tableau à la recherche d'un prises déjà libre (fermé = 0) de plus en plus que array pour contenir un nouveau socket sockets si aucune socket libre n'est disponible dans le tableau sockets, Ce sera plus tard l'index des sockets pour identifier chaque connexion seule. Je ne sais pas si c'est une bonne approche, mais cela fonctionne bien et stable jusqu'à ce que j'ai essayé de stresser mon serveur avec environ 15 clients ouverts en même temps. Le problème auquel je suis confronté est que certaines applications clientes obtiennent un délai de connexion et que le serveur devient instable en manipulant ces connexions multiples en même temps. Je n'envoie pas beaucoup de données seulement 20 octets sur chaque événement de connexion reçu du serveur. J'ai essayé d'augmenter la valeur Carnet de commandes sur la écouter appel, mais cela n'a pas aidé non plus. Je dois attendre plus longtemps pour que ces clients se connectent. Mais ils se connectent finalement. Et le serveur réagit encore aux nouvelles connexions plus tard (si je ferme toutes les applications de ces clients par exemple ou si j'ouvre une nouvelle application client, il se connectera immédiatement). De plus, ces connexions restent ouvertes et je ne ferme pas le socket du côté client.Winsock 15 connexions en même temps devient instable
J'utilise CSocketPlus classe
événement de demande de connexion
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
Est-ce que quelqu'un sait pourquoi il y a un des problèmes de performance lorsque plusieurs connexions se produisent en même temps? pourquoi le serveur devient lentement à la réponse?
Ce qui rend le serveur d'accepter plus rapidement?
J'ai aussi essayé de ne pas accepter la connexion-à-dire de ne pas appeler accepter le cas de demande de connexion, mais toujours le même problème.
EDIT: J'ai essayé de mettre une variable de débogage pour imprimer la sortie du numéro de prise sur l'événement FD_ACCEPT sur la CSocket classe et il semble que WndProc tarde à afficher les messages en cas de beaucoup de connexions.