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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
| class Core_copier
{
// public
long ip; // IPEndpoint prend un long pour l'ip
ushort port;
// privé
private static String reponse = String.Empty;
// ManualResetEvent permet d'avertir les threads d'évènements
//
private static ManualResetEvent connexionOK = new ManualResetEvent(false);
private static ManualResetEvent envoiOK = new ManualResetEvent(false);
private static ManualResetEvent receptionOK = new ManualResetEvent(false);
public void connexion()
{
try
{
IPAddress ipadress = IPAddress.Parse("216.58.208.195"); //216.58.208.195 = google
port = 80;
Console.WriteLine("Tentative de connexion à {0}", ipadress);
IPEndPoint remoteEP = new IPEndPoint(ipadress, port);
Socket sClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Type ipv4; stream = connexion 2points;
//sClient.Bind(new IPEndPoint(ipadress, port)); // Bind sur l'ip fournit (ecoute) Erreur concerne les serveurs
sClient.BeginConnect(remoteEP, new AsyncCallback(ConnexionCallback), sClient); // Connexion callback ici permettra de dire que la connexion est bien faite
connexionOK.WaitOne(); // Bloque le thread jusqu'à avoir reçu un signal
//--- Début du dialogue
//Envoi
Send(sClient, @"GET / HTTP/1.1\r\nHost: www.paperclip.netai.net \r\nConnection: close\r\n\r\n");
envoiOK.WaitOne();
//Reception
Receive(sClient);
receptionOK.WaitOne();
Console.WriteLine("Vous avez un message: {0}", reponse);
//Fermeture du socket
sClient.Shutdown(SocketShutdown.Both);
sClient.Close();
Console.WriteLine("Fermé");
}
catch (Exception e)
{
Console.WriteLine("Erreur de connexion");
Console.WriteLine(e.ToString());
}
}
// Indique que la connexion est achevée
private void ConnexionCallback(IAsyncResult ar)
{
try
{
// Récupère le socket client depuis l'état
Socket sClient = (Socket)ar.AsyncState; // Cast (conversion explicite)
// C'est obligatoire pour les conversions qiu ne peuvent pas se faire sans perte de données
// Complete la connexion
// Met fin à l'attente et indique que la connexion est établit
sClient.EndConnect(ar);
//
Console.WriteLine("Socket connecté sur {0}", sClient.RemoteEndPoint.ToString()); // On indique à l'utilisateur que la connexion est établit avec ...
Console.WriteLine(ar.ToString());
// Signal au thread que l'on peut poursuivre
connexionOK.Set();
}
catch (Exception e)
{
Console.WriteLine("Erreur de connexion callback");
Console.WriteLine(e.ToString());
}
}
// ---- Fonction d'envoie de données
private void Send(Socket sClient, string message)
{
// Encodage en bytes (obligatoire);
byte[] byteMessage = Encoding.ASCII.GetBytes(message);
sClient.BeginSend(byteMessage, 0, byteMessage.Length, 0, new AsyncCallback(SendCallback), sClient);
}
private void SendCallback(IAsyncResult ar)
{
try
{
// Récupère le socket client depuis l'état (cast)
Socket sClient = (Socket)ar.AsyncState;
// On complète le message
int bytesSent = sClient.EndSend(ar);
Console.WriteLine("Envoyé {0} bytes au serveur", bytesSent);
// Signal que le message est parti
envoiOK.Set();
}
catch (Exception e)
{
Console.WriteLine("Erreur de sendcallback");
Console.WriteLine(e.ToString());
}
}
// Fonctions de réception des données
private void Receive(Socket sClient)
{
try
{
// Création du paquet
StateObject state = new StateObject();
state.workSocket = sClient;
Console.WriteLine("Debut de reception");
// Début de la réception des données
sClient.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); // 2nd args = offset, 4 = socketflag
}
catch (Exception e)
{
Console.WriteLine("Erreur de receive");
Console.WriteLine(e.ToString());
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket sClient = state.workSocket;
// Lit les données du remote service
int bytesRead = sClient.EndReceive(ar); // renvoie le nombre de bytes
if (bytesRead > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
// Il doit y avoir plus de données donc on va continuer de recevoir
sClient.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
else
{
// Toutes les données sont arrivées, on organise la réponse
if (state.sb.Length > 1)
{
reponse = state.sb.ToString();
}
// Débloque le thread
receptionOK.Set();
}
}
catch (Exception e)
{
Console.WriteLine("Erreur de receivecb");
Console.WriteLine(e.ToString());
}
}
}
} |
Partager