La diffusion via TCP est-elle possible?

J’écris un système serveur / client en C, qui utilise BSD Sockets sous une connexion TCP. Le serveur est multi-thread, chaque connexion étant exécutée dans son propre récepteur. Chaque client parle bien avec le serveur individuellement. Malheureusement, je ne trouve pas de moyen d’implémenter une fonction SendToAll (), par exemple, si le client A fait quelque chose qui nécessite l’envoi d’un paquet à tous les clients. Comment je ferais ça?

J’envisageais de mettre en place une queue dans chaque récepteur, et toute émission est envoyée à ces files d’attente; lorsque le récepteur envoie un nouveau paquet, il ajoute également ce message, si cela a du sens.

Mais oui, y a-t-il un moyen de diffuser via TCP, comme vous pouvez le faire via UDP?

Comme tout le monde l’a dit, ce n’est pas possible avec TCP, c’est uniquement en monodiffusion. Cependant, il existe des implémentations de multidiffusion fiable, qui devraient vous donner une multidiffusion avec la fiabilité de TCP. Voir wikipedia , en particulier Multicast général pragmatique .

Non, il n’y en a pas. Par exemple, le concept de taille de la fenêtre et de la façon dont elle est ajustée n’a plus aucun sens si vous essayez de parler à plusieurs personnes.

Il pourrait être possible de créer un nouveau protocole partageant de nombreux atsortingbuts de TCP tout en permettant la multidiffusion. Mais je pense que ce serait très problématique. Par exemple, la vitesse à laquelle les destinataires recevraient des données serait limitée par les limitations du destinataire le plus lent. L’expéditeur doit gérer l’espace tampon de manière à ce que même le récepteur le plus lent puisse recevoir des retransmissions si nécessaire.

Non, je pense que les protocoles pour la multidiffusion devront toujours être très spécifiques et se focaliser sur le problème exact. Quelque chose de généralisé et de type TCP n’est tout simplement pas faisable.

Il existe des moyens d’effectuer un transfert de données en masse multicast fiable. L’idée de base est d’utiliser des codes d’effacement pour transmettre en continu des informations dans une sorte de boucle. Ensuite, un destinataire peut simplement commencer à recevoir des paquets jusqu’à ce qu’il en ait assez pour reconstruire le fichier d’origine.

Mais ceux-ci ne semblent pas correspondre parfaitement à votre scénario.

Pensez aux réseaux superposés ou utilisez simplement un middleware de messagerie fournissant une sémantique de publication telle que ØMQ, qui fournit également une API de socket BSD.

Votre SendToAll() devra parcourir tous les sockets ouverts et écrire les données dans chacun d’eux indépendamment.

La diffusion et la multidiffusion sont limitées aux sockets UDP.