oui et on te l'a indiqué, mais tu n'arrives pas à la mettre en oeuvre
il te manque peut etre des connaissances sur le langage pour y arriver
moi il m'a fallu du temps avant de comprendre les méthodes asynchrones du framework et les callbacks
je rééexplique quand meme
beginaccept prend en paramètre un callback (information que de quelle sub appeler quand il a ce qu'il lui faut, ici une connexion au serveur)
la sub est appelée quand c'est ok, et dans cette sub, si pour établir la connexion il faut faire endaccept
begin + end équivaut donc à accept, sauf qu'accept est une méthode qui attend jusqu'à que la connexion soit établie
(...)
j'ai fini par te faire le code, si tu ne comprends pas tout le code ou son fonctionnement, utilise msdn (F1 sur un mot) et l'intellisense
on créé un tcpclient
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 Private _mre As New System.Threading.ManualResetEventSlim(False) Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim t As New System.Net.Sockets.TcpClient Dim callback As New AsyncCallback(AddressOf ConnexionPossible) t.BeginConnect("google.fr", 960, callback, t) _mre.Wait(2000) ' on attend 2 secondes ou moins si la connexion passe If _mre.IsSet Then MsgBox("connexion ok") Else MsgBox("connexion pas ok, on tente sur le port 80") t.Close() t = New System.Net.Sockets.TcpClient t.BeginConnect("google.fr", 80, callback, t) _mre.Wait(2000) ' on attend 2 secondes ou moins si la connexion passe t.Close() If _mre.IsSet Then MsgBox("connexion ok") Else MsgBox("connexion pas ok") End If End If End Sub Private Sub ConnexionPossible(ar As IAsyncResult) Try Dim t As System.Net.Sockets.TcpClient = DirectCast(ar.AsyncState, System.Net.Sockets.TcpClient) If t.Client Is Nothing Then Exit Sub ' socket fermé _mre.Set() ' on débloque la ligne _mre.Wait(2000) t.EndConnect(ar) ' on fini de connecter, t est utilisable après Catch ex As Exception MsgBox("erreur") End Try End Sub
on créé un callback en lui donnant la sub à appeler à la fin
on appelle beginconnect dans un premier temps sur quelque chose qui ne répond pas (google sur le port 960 au lieu de 80)
on dit d'attendre 2 secondes
si l'objet qui sert à attendre dit qu'il a été débloqué par le set ca veut dire que la connexion est bonne (msgbox ok)
sinon on ferme le socket car il n'est plus utilisable
! : le socket un fois fermé va appeler le callback quand même, mais avec t.client à nothing (testé dans le callback)
si la connexion passe (2ème tentative) le callback est appelé, on retrouve le socket qui a demandé de passer par ce callback dans ar.AsyncState (beginconnect demande un state as object en dernier paramètre, on peut en théorie mettre ce qu'on veut)
si c'est ok on fait t.endaccept(ar) et ca doit être bon
NB :
ici j'attend 2 secondes mais sur le thread principal, donc c'est bloquant
tu peux réécrire ca avec un timer qui ne bloque pas l'interface
une autre méthode aurait été de créer un thread, de faire .accept et sur le thread principal via un timer si ca fait plus de 2 secondes tu faire thread.interrupt, c'est plus simple à écrire, plus propre je ne sais pas
et je n'ai jamais utilisé le tcpclient, j'ai juste utilisé l'intellisense google et msdn
le fait que le .close fait que le callback est appelé je l'ai pas deviné, ca se constate en testant et google l'explique
donc il faut apprendre un peu plus avant de coder, sinon on avance pas (et apprendre à chercher aussi car il doit y avoir des sources sur le net quand même)
Partager