La diffusion via TCP est-elle possible?
Je suis en train d'écrire un serveur/client système en C, qui utilise des Sockets BSD en vertu d'une connexion TCP. Le serveur est multi-thread, à chaque connexion exécute dans son propre récepteur. Chaque client fait un bon travail en discutant avec le serveur sur un un-à-un, malheureusement je ne peux pas penser à une façon de mettre en œuvre un SendToAll() une fonction, par exemple, si Un client a fait quelque chose qui nécessite l'envoi d'un paquet à l'ensemble des clients. Comment puis-je faire?
J'ai été d'examiner la mise en œuvre d'une file d'attente dans chaque récepteur, et la diffusion est envoyé à ces files d'attente; lorsque le récepteur envoie un nouveau paquet, il ajoute que les message sur le paquet ainsi, si cela a un sens.
Mais oui, est-il possible de diffuser via TCP, comme vous pouvez le faire via UDP?
source d'informationauteur Anthony
Vous devez vous connecter pour publier un commentaire.
Comme tout le monde a dit que c'est pas possible avec le protocole TCP, il est de monodiffusion. Cependant, il existe des implémentations de multicast fiable, qui devrait vous donner de multidiffusion avec la fiabilité de TCP. Voir wikipediaen particulier Pragmatique De Multidiffusion Général.
Non, il n'y en a pas. Par exemple, la notion de taille de la fenêtre et comment il est réglé devient complètement dénuée de sens si vous essayez de parler à de multiples parties.
Il pourrait être possible de créer un nouveau protocole qui partage bon nombre des attributs de TCP tout en permettant de multidiffusion. Mais je pense qu'il serait très problématique. Par exemple, la vitesse à laquelle les bénéficiaires ont reçu des données serait contraint par les limites de la plus lente du récepteur. L'expéditeur doit gérer l'espace de mémoire tampon, de sorte que même la plus lente récepteur peut re-transmissions si nécessaire.
Non, je pense que des protocoles pour faire de multidiffusion sont toujours va être très spécial fin et concentré sur le problème exact à portée de main. Quelque chose de généralisé et TCP-like n'est tout simplement pas faisable.
Il y a des façons de le faire multicast fiable de transfert de données en vrac. L'idée de base est d'utiliser effacement des codes en permanence de transmettre des informations dans une sorte de boucle. Ensuite, un destinataire peut juste commencer à recevoir des paquets jusqu'à ce qu'ils aient assez pour reconstruire le fichier d'origine.
Mais ils ne semblent pas s'adapter à votre scénario très bien.
Envisager de chercher à des réseaux de recouvrementou tout simplement à l'aide d'un middleware de messagerie qui fournit publier sémantique comme ØMQ qui a également idéalement fournit une API socket BSD.
Votre
SendToAll()
aurez besoin pour itérer sur tous les sockets et écrire les données de chacun de façon indépendante.De diffusion et de multidiffusion sont limitées pour les sockets UDP.