Salut à tous !
Je suis ici ce soir car j'ai un petit problème... ( eh oui, encore un! )
Malgré mes recherches, je ne trouve pas grand-chose
( ou bien mon cerveau qui n'est pas assez gros ? )
J'aime bien le dev, et j’apprends de moi-même,
alors plus vous pourrez m'apprend, et plus je serais :
Enfin bref, je suis actuellement entrai de développer une application qui
communique en TCP avec d'autres ( architecture client-serveur )
Dans ce cas, de multiples clients peuvent se connecter au "serveur"
Seulement je rencontre quelques problèmes lors de la fermeture du Socket
Voici mon code ( le plus simple possible )
Classe TcpClient : prévue pour traiter chaque client séparément
Classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 private int maxConnections = 1; // socket principal public Socket socketHandler; // liste des clients connectés public HashSet<TcpClient> clients = new HashSet<TcpClient>();; public Boolean startListening(int _port, int _maxConnections) { try { this.maxConnections = _maxConnections; //bind et listen socketHandler = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketHandler.Bind(new IPEndPoint(IPAddress.Any, _port)); socketHandler.Listen(this.maxConnections); socketHandler.BeginAccept(new AsyncCallback(newConnection), socketHandler); } catch() { } } private void newConnection(IAsyncResult iAr) { try { Socket socket = ((Socket)iAr.AsyncState).EndAccept(iAr); // "Nouvelle connection !" // ajout clients.Add(new TcpClient(socket, clientCount)); } catch() { } socketHandler.BeginAccept(new AsyncCallback(newConnection), socketHandler); } }
Maintenant la fonction qui ferme ce socket :
Jusque là tout va bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void destroy() { foreach (TcpClient client in clients) { // appel de fonction de fermeture de tous les clients listés client.Disconnect(); } clients = null; }
D'après la doc, pour fermer le socket :
Erreur : je reçoit aussi une connexion de la part de "newConnection"
Code : Sélectionner tout - Visualiser dans une fenêtre à part socketHandler.Shutdown (SocketShutdown.Both);
Avec l'erreur : Une requête d'envoi ou de réception de données n'a pas été autorisée car le socket n'est pas connecté
puis :
Erreur : je reçoit une connexion de la part de la fonction "newConnection"
Code : Sélectionner tout - Visualiser dans une fenêtre à part socketHandler.Close();
Avec l'erreur : "Impossible d'accèder à un objet supprimé", ce que es logique puisque qu'il est fermé ...
Là je suis un peu à sec ... si quelqu'un voit comment faire, il est le bienvenu !
Je pense avoir tout expliqué, plus ou moins clairement
Je vous remercie d'avance pour votre aide
.
Partager