7
votes

Limitation de Windows sur le nombre de sockets / connexions ouvertes simultanément par machine

Disons que je dispose de Windows 7 avec une interface réseau réelle et quelques interfaces de bouclage. J'ai un serveur compatible IOCP qui accepte les connexions des clients. J'essaie de simuler autant que possible connexions de clients réels au serveur.

Mon code client établit simplement x quantité de connexions de socket (Notez que le client se lie à une interface donnée): xxx

sur une interface de bouclage, j'ai plusieurs IP que j'utilise pour la liaison. De plus, j'utilise également une réelle interface pour se lier. J'ai rencontré un problème lorsque la quantité de prises ouvertes est d'environ 64k par machine:

exception non gérée: système.net.sockets.socketException: une opération sur une prise n'a pas pu être effectuée car le système manquait Un espace tampon suffisant ou parce qu'une file d'attente était pleine

J'ai essayé plusieurs choses impuissantes comme: - Définition de MaxUserPort sur la valeur max et d'autres paramètres TCPIP recommandés dans le registre. - essayer d'exécuter deux serveurs sur différentes interfaces (interfaces réelles et boucles de bouclage) et en utilisant plusieurs clients.

est-ce une limitation connue dans Windows ou sa possibilité de surmonter en quelque sorte?

Merci Pour l'aide!


4 commentaires

Vérifiez cette Répondre


Merci, j'ai lu ce fil mais cela ne répond pas vraiment à la question. J'ai essayé ce que Charleso a fait, mais cela n'a pas vraiment fonctionné.


"Notez que le client se lie à une interface donnée". Pourquoi?


En général en raison de la limitation TCP / IP dans le nombre de ports par une adresse IP. Donc, je voulais, par ex. 64K ports ouverts sur interface1 et 64k ports ouverts sur interface2, etc. Mais la quantité totale / globale de ports que je peux lier sur toutes les interfaces du système est toujours d'environ 64k. Par exemple. Voici le message: Stackoverflow.com/a/634547/1238124


4 Réponses :


1
votes

Dans votre exemple de code, vous appelez Bind (Bindendpoint) , mais vous ne montrez pas comment BindendPoint est défini. Vérifiez que:

  • Votre système a réellement plusieurs adresses IP (la boucle ne compte pas)
  • Vous définissez en fait l'adresse IP du point d'extrémité à une adresse IP (pas de bouclage)
  • Les lichons sont étalées sur plusieurs adresses IP

    L'adresse de bouclage ne compte pas car de nombreux systèmes le traitent spécialement à des fins de routage et de liaison. Donc, la liaison aux ports en bouclage peut repousser les ports sur toutes les adresses de toutes les identiques que si vous liez inaddr_any ( 0.0.0.0 ).


1 commentaires

J'ai placé le code complet maintenant. Comme je l'ai expliqué, même si je lie différentes interfaces (réel et bouclack, ou uniquement en boucle): Server1 et Client1 sur Interface1, Server2 et Client2 sur Interface2, etc. Toujours le nombre maximum de prises ouvertes par système est d'environ 64k.



5
votes

J'ai trouvé sur une certaine page Microsoft que:

... HKEY_LOCAL_MACHINE \ System \ CurrentControlset \ Services \ TCPIP \ Paramètres \ MaxUSERPORT La sous-clé de registre est définie comme le port maximal vers lequel les ports peuvent être attribués pour des liaisons génériques. La valeur de l'entrée de registre MaxUSERPORT Définit la plage de ports dynamiques ...

Donc, si je force le point final à utiliser un certain port, par exemple xxx

puis je peux ouvrir plus de 64 000 sockets simultanés dans le système. < / p>


0 commentaires

0
votes

TCP et UDP utilisent un entier non signé 16 bits pour désigner le numéro de port. Je n'imagine aucune implémentation dans aucun système d'exploitation pour pouvoir ouvrir plus de 65535 sockets par adresse liée au mieux. De plus, je ne serais pas surpris si Windows n'mettraire pas des tables d'état entièrement isolées pour chaque adaptateur ou chaque adresse liée, mais s'appuie plutôt sur une table d'état mondial. Si tel est le cas, ce serait une limite d'architecture de réseau Windows au lieu d'une limite molle et configurable.


0 commentaires

0
votes

J'ai développé un outil de test de charge.

Exécution de la RAM Windows 10 / 16G, il pourrait créer 60 000 connexions avec serveur avec succès.

Mais lorsque vous essayez de créer plus de connexions, l'outil signalera «Socket Winerror 10055 sans espace tampon disponible» bientôt.

accord à Article , je pense que la limitation est la taille de la mémoire tampon globale de l'ensemble du système d'exploitation, pas le nombre de fichiers ouverts.


0 commentaires