Écho du serveur TCP multi-threadé à tous les clients

J’ai travaillé sur un serveur TCP / Punch TCP / TCP via une configuration de salle de conversation. Je l’ai configuré avec succès dans UDP et maintenant je veux faire la même chose pour TCP car je suis un peu rude sur mes sockets atm.

de toutes les manières que les clients peuvent se connecter correctement et discuter et recevoir des échos, mais en fonction de la quantité de connexions, ils retourneront au même client qui a envoyé le message en fonction du nombre de clients connectés. Par exemple, 3 clients clients connectés2 envoient un ping renvoyant au client 2, 3 fois. il devrait passer par une boucle de la liste IPEndPoint de tous les utilisateurs connectés et faire un sock.SendTo (données, data.Length, clients [i]);

mais son retour au client qui a envoyé le message. aucune idée de ce que l’on a fait mal, mais je pensais que c’était bien. mais cela me dérange. des conseils sur ce que j’ai mal fait seraient très appréciés.

private static void Main(ssortingng[] args) { //create a socket //create a end point to listen on //bind //listen //accept the socket on a new socket //receive //store the connection in a list //ping back on their socket //go back to listening state Console.Title = " TCP NAT PT Server"; StartServer(); } private static void StartServer() { Thread ListenThread = new Thread(new ThreadStart(Listen)); ListenThread.Start(); Console.WriteLine("ListenThread: " + ListenThread.ThreadState); } private static void Listen() { try { server.Bind(ep); server.Listen(0); } catch (Exception e) { Console.WriteLine(e.Message); } while (true) { try { Socket handler = server.Accept(); Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientCommunication)); clientThread.Start((object)handler); Console.WriteLine("ReceiveThread: " + clientThread.ThreadState); ssortingng rstr = handler.RemoteEndPoint.ToSsortingng(); ssortingng[] rdata = rstr.Split(':'); IPEndPoint rep = new IPEndPoint(IPAddress.Parse(rdata[0]), int.Parse(rdata[1])); clients.Add(rep); } catch (Exception e) { Console.WriteLine(e.Message); } } } private static void HandleClientCommunication(object Client) { Socket sock = (Socket)Client; byte[] data = new byte[1024]; ssortingng str = ssortingng.Empty; while (true) { try { int rec = sock.Receive(data, SocketFlags.None); Array.Resize(ref data, rec); str = Encoding.ASCII.GetSsortingng(data); Console.WriteLine(sock.RemoteEndPoint.ToSsortingng() + " >> " + str); //Console.WriteLine(clients.Count); //Console.WriteLine(clients[0].Address + ":" + clients[0].Port); ssortingng temp = Encoding.ASCII.GetSsortingng(data); temp = "Echo: " + temp; data = Encoding.ASCII.GetBytes(temp); Console.WriteLine("Data.Length: " + temp.Length); for (int i = 0; i < clients.Count; i++) { sock.SendTo(data, data.Length, SocketFlags.None, clients[i]); //sock.Send(data, data.Length, SocketFlags.None); } data = new byte[1024]; } catch (Exception e) { //socket error Console.WriteLine(e.Message); } } 

Le problème est dans cette ligne:

  sock.SendTo(data, data.Length, SocketFlags.None, clients[i]); 

selon la méthode SendTo doc :

Si vous utilisez un protocole orienté connexion, vous devez d’abord établir une connexion hôte distante en appelant la méthode Connect ou accepter une demande de connexion entrante à l’aide de la méthode Accept.

Vous utilisez un socket connecté à Endpoint A pour envoyer des octets à Endpoint B via TCP, ce qui ne fonctionnerait pas réellement.

Ainsi, au lieu de conserver les points de terminaison dans les clients, conservez une liste de sockets dans la méthode listen:

 while (true) { try { Socket handler = server.Accept(); Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientCommunication)); clientThread.Start((object)handler); Console.WriteLine("ReceiveThread: " + clientThread.ThreadState); clients.Add(handler); } catch (Exception e) { Console.WriteLine(e.Message); } } 

et changez la boucle pour envoyer des messages à ceci:

 for (int i = 0; i < clients.Count; i++) { clients[i].Send(data); } 

Juste un heads-up: Pour éviter les erreurs, vous devez supprimer des éléments de la liste des clients une fois que le socket client se rapproche.