Bonjour,
J'éssaye faire de la programmation réseau asynchrone, à partir des méthodes synchrones de la classe Socket. Mais lors de mes tests, il s'est avéré que je ne pouvais pas fermer une socket, alors que celle si était en train d'attendre un message sur un autre thread. Voici le code de mon projet test :
D'après la documentation, la fonction Shutdown de la classe Socket devrait désactiver les envois et réceptions de données, mais cela ne fonctionne pas ( pas avec les fonctions synchrones en tout cas ).
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 public partial class Form1 : Form { Socket srv; Socket cli; public Form1() { InitializeComponent(); string ip = "127.0.0.1"; int port = 24000; // Initialisation de la socket serveur srv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); srv.Bind(new IPEndPoint(IPAddress.Parse(ip), port)); srv.Listen(1); ThreadPool.QueueUserWorkItem(o => { while(true) srv.Accept(); }); // Initialisation de la socket cliente cli = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); cli.Connect(ip, port); ThreadPool.QueueUserWorkItem(o => { byte[] tmp = new byte[100]; while (true) cli.Receive(tmp); }); } // Evenement OnClick du bouton dclenchant la fermeture de la socket cliente private void button1_Click(object sender, EventArgs e) { cli.Shutdown(SocketShutdown.Both); cli.Close(); } }
Vous allez me dire, ben utilises les fonctions asynchrones dans ce cas. Mais je cherche un maximum d'optimisation, et les fonctions asynchrones du framework ont d'assez mauvaises performances, selon quelques tests que j'ai put effectué.
Donc ma question est la suivante : Comment interompre un appel bloquant, d'une fonction de socket, sans déclenché d'exeption ?
Partager