Comment obtenir une nouvelle connexion de socket en milieu de session?

J’utilise des sockets TCP de style C avec send() et recv() . J’ai une connexion en cours d’exécution entre l’utilisateur A et l’utilisateur B, l’utilisateur A agissant en tant que serveur et l’utilisateur B agissant en tant que client.

Je souhaite avoir un utilisateur passif C, qui ne communique rien, mais reçoit des données de l’utilisateur A. Toutefois, le nouvel utilisateur passif C peut rejoindre la session à tout moment. A pourrait envoyer à C des paquets différents de ceux qu’il enverrait à B .. J’imagine qu’il serait préférable que AC communique sur un port différent de celui de AB.

Comment cette connexion peut-elle être établie (sans filetage, etc.) dans un sharepoint communication arbitraire?

modifier toujours non résolu.

Vous pouvez configurer un écouteur qui détecte les nouvelles connexions et refléter le trafic sur tous les sockets ouverts. J’ai récemment écrit ce que je veux dire en C #: (je verrai si je peux rapidement transformer cela en échantillon C)

Cet exemple accepte uniquement un nombre fixe de connexions entrantes au début, mais il est très facile de changer cela.

 using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Linq; public class Demo { static IList StartServer(int numberOfClients) { using(Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { main.Bind(new IPEndPoint(IPAddress.Any, 9050)); main.Listen(numberOfClients); var clients = Enumerable .Range(1,numberOfClients) .Select(i => { Console.WriteLine("Waiting for 1 more client..."); Socket client = main.Accept(); Console.WriteLine("Connected to {0}", client.RemoteEndPoint); return client; }) .ToList(); main.Close(); return clients; } } public static void Main() { var clients = StartServer(4); while(clients.Count()>1) // still a conversation { var copyList = clients.ToList(); Console.WriteLine("Monitoring {0} sockets...", copyList.Count); Socket.Select(copyList, null, null, 10000000); foreach(Socket client in copyList) { byte[] data = new byte[1024]; int recv = client.Receive(data); if (recv == 0) { Console.WriteLine("Client {0} disconnected.", client.RemoteEndPoint); client.Close(); clients.Remove(client); } else foreach (var other in clients.Except(new [] {client})) other.Send(data, recv, SocketFlags.None); } } Console.WriteLine("Last client disconnected, bye"); } } 

Vous pouvez simplement ouvrir 2 sockets sur le serveur A et les lier sur 2 ports différents. Ensuite, utilisez la fonction select sur les 2 descripteurs de fichier de socket créés.

Select reviendra pour la première fois lorsqu’un des 2 clients se connecte. Rappelez-vous que côté serveur, après avoir accepté une connexion, vous devez définir le nouveau descripteur de fichier renvoyé (avec FD_SET) afin de permettre à select d’écouter les événements qui se produiront sur le nouveau socket (qui est retourné d’accepter).