Question

J'écris une application client-serveur à l'aide de sockets BSD. Il doit fonctionner en arrière-plan, transférer les données en continu, mais ne peut pas utiliser la bande passante de l'interface réseau en utilisation normale. En fonction de la vitesse de l'interface, je dois limiter cette connexion à un certain taux de transfert maximal.

Quel est le meilleur moyen d'y parvenir, par programmation?

Était-ce utile?

La solution

Le problème de la mise en veille d'une durée constante d'une seconde après chaque transfert est que les performances de votre réseau sont instables.

Soit BandwidthMaxThreshold le seuil de bande passante souhaité.

Soit TransferRate le taux de transfert actuel de la connexion.

Alors ...

Si vous détectez votre taux de transfert > BandwidthMaxThreshold, alors vous effectuez SleepTime = 1 + SleepTime * 1.02 (augmentez le temps de veille de 2%)

Avant ou après chaque opération de réseau, effectuez une Sommeil (SleepTime)

Si vous détectez que votre taux de transfert est bien inférieur à votre seuil BandwidthMaxThreshold, vous pouvez diminuer votre temps de veille. Sinon, vous pouvez simplement décroître / diminuer votre heure de sommeil au fil du temps. Votre SleepTime finira par atteindre 0.

Au lieu d’une augmentation de 2%, vous pouvez également augmenter de façon plus linéaire la différence entre TransferRate - BandwidthMaxThreshold.

Cette solution est bonne, car vous ne pourrez pas vous endormir si le réseau de l'utilisateur n'est déjà pas à la hauteur de vos attentes.

Autres conseils

La meilleure solution consiste à utiliser un compartiment à jetons .

N'émettez que lorsque vous avez assez de jetons pour remplir un paquet (1460 octets serait une bonne quantité), ou si vous êtes le côté réception, lisez à partir du socket uniquement lorsque vous avez assez de jetons; un peu de calcul vous dira combien de temps vous devez attendre avant de disposer de suffisamment de jetons pour pouvoir dormir autant de temps (prenez bien soin de calculer combien de jetons vous avez gagnés de combien vous avez réellement dormi, car la plupart des systèmes d'exploitation peuvent mettre votre processus en veille plus longtemps que vous ne l'aviez demandé).

Pour contrôler la taille des rafales, limitez le nombre maximal de jetons que vous pouvez avoir. une bonne quantité pourrait représenter une seconde de jetons.

J'ai eu de la chance avec filet de pêche . C'est cool parce qu'il peut étrangler des applications arbitraires de l'espace utilisateur sans modification. Cela fonctionne en préchargeant ses propres fonctions d’envoi send / recv qui calculent la bande passante pour vous.

Le plus gros inconvénient que j'ai constaté est qu'il est difficile de coordonner plusieurs applications avec lesquelles vous souhaitez partager une bande passante finie. " ruisselé " aide, mais j’ai trouvé cela compliqué.

Mise à jour en 2017: il semble que le filet ait été déplacé vers https://github.com/mariusae/trickle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top