2016-06-30 2 views
0

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.

Répondre

0

Ok le problème semble être de ma connexion. J'ai déplacé mon serveur à mon RDP qui a la vitesse de téléchargement de 250Mbps avec la vitesse de téléchargement de 200Mbps et il semble fonctionner très bien là. Testé avec 100 client fait une connexion et chacun d'entre eux connecté immédiatement !. Je me demande pourquoi j'ai de tels problèmes où ma connexion à la maison est 40/40 Mbps ... hmmm. Quelqu'un sait pourquoi cela arrive?

Edit: Il semble être l'option routeur!

Activer le pare-
Activer la protection DoS

désactivé le pare-feu (juste à des fins de test) et tout fonctionne parfaitement! Donc, en gros, le routeur pense qu'il y a une sorte d'attaque DOS. Cela ralentira donc le trafic.