Utilisation asynchrone des sockets
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 :
Code:
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();
}
} |
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 ).
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 ?