# Dotnet > Gnral Dotnet > Rseau >  Rception UDP avec des sockets

## Gregory_007

Bonjour a tous
Je suis nouveau sur le forum, donc je vous remercie tout de suite pour l'aide que vous allez pouvoir m'apporter.

J'apprend tranquillement comment fonctionne les sockets pour mon projet final d'tude qui sera de la domotique.

Prsentement, j'arrive a envoyer et recevoir des donnes via les sockets en UDP. Seulement pour afficher les messages reus, j'ai du mettre mon code dans un "click button", sinon mon code plantait toujours.

Voici mon code de rception:


```

```

Pourriez-vous m'aider a savoir comment recevoir et afficher automatiquement le message ?
Merci
Grgory

----------


## GuruuMeditation

Ca plantait avec exception , ou l'appli semblait bloque ? Si c'est le second, c'est probablement dt au fait que Receive est bloquant : il va bloquer le thread jusqu'a ce qu'il ait des donnes (il y a moyen de mettre un timeout aussi). Pour ne pas bloquer, soit utiliser BeginReceive, ou faire du multi-thread.

----------


## Gregory_007

Salut GuruuMeditation;

Je viens de faire le test et l'application semble bloqu, car je n'ai pas de message d'erreur. 

Comme je suis a la limite de mes connaissances en c#, qu'est ce qui serait le plus facile selon toi: BeginReceive ou  multi-thread ?

Je regard les 2 ... et aucun n'a l'aire facile.

Pour te guider, mon ordinateur va communiqu avec une carte arduino en UDP et la carte va devoir me retourn le statue ( lumire, chauffage...). C'est seulement ordi <=> arduino ou si tout fonctionne bien ordi <=> routeur <=> arduino.
Merci
Grgory

----------


## GuruuMeditation

Le plus simple est probablement avec le BeginReceive et EndReceive.

L'ide est d'appeller le BeginReceive, ou tu va lui passer une mthode comme callback. Cette mthode sera appelle quand il recevra des donnes.
Dans cette mthode, tu appelles le EndReceive pour pouvoir lire les donnes. Et tu relance un BeginReceive pour les donnes suivantes.

----------


## Gregory_007

Bonjour GuruuMeditation,

J'ai trouv sur internet plusieurs code qui parle de BeginReceive et EndReceive.
Quand tu me parle d'une mthode qui s'appel callback, et ce que c'est la mme chose que AsyncCallback ?

Je voudrais me servir de ce projet pour bien comprendre BeginReceive et EndReceive car je trouve que c'est le seule que j'ai trouv qui a l'air complet.

Pour essayer de comprendre le code:
il y a une fonction 

```
WaitForData()
```

 qui contient 

```
clientSocket.BeginReceive
```

 qui celle-ci contient 

```
AsyncCallback(RecieveComplete)
```

. Ensuite, je ne sais pas trop quand mais la fonction 

```
RecieveComplete(IAsyncResult result)
```

 est appeler et dans celle-ci 

```
WaitForData()
```

 et de nouveau appeler ainsi de suite ?!?!  ::calim2:: 
Grgory

----------


## GuruuMeditation

Callback n'est pas le nom d'une mthode, mais cela veut dire que c'est une methode qui va tre appelle aprs le traitement d'un autre process ou aprs un certain evenement.
Un exemple (trs simple, ecrit dans le train, donc non test  :;):  ):



```

```

----------


## Gregory_007

Bonjour GuruuMeditation,

J'ai essay avec le code que tu m'as donn seulement a ne marche pas. Le problme vient peut tre du code que j'ai prsentement. Ne soit pas surpris, c'est super simple comme code, mais est-ce que selon toi, il pourrait y avoir un problme 



```

```

Je mettre ton code  la suite et jappellerai StartListening() a la connexion (button5_Click) du socket pour commencer la sorte de boucle que tu m'as expliquer ds la connexion.
Est-ce que a aurait du sens ?
Merci
Grgory

----------


## Gregory_007

Je me suis rendu compte que j'ai dis une connerie.
StartListening() ne doit pas tre mis a button5_Click, elle va dmarrer a la rception de quelque chose.
J'ai continu avec ton code. A aucun moment le programme va a StartListening() et CallbackMethod(IAsyncResult ar), pourtant quand je clique sur mon bouton de rception, il y a quelque chose.
Je continue les tests...

----------


## Gregory_007

Bonjour GuruuMeditation,
J'ai beau essay, il n'y a pas de rsultat.

Voici le code que j'ai modifi en prenant des info par-ci par-l


```

```

Que dalle, il se passe rien...en faisant un dbogage pas a pas, je rentre jamais dans la fonction CallbackMethod ou StartListening.
Que faire ?
Merci
Grgory

----------


## GuruuMeditation

Tu dois avoir une autre mthode callback pour ton beginconnect.
Dans cette mthode, tu appelles endconnect. Et, si la connexion est ok, tu commences alors avec beginreceive

----------


## Gregory_007

Bonjour

Hey !!!!!!
J'ai russi. a tait super dur, mais a marche maintenant. Merci beaucoup pour ton aide.
Je vais faire des tests pour tre sur que a va continuer a fonctionner comme il faut.  ::ccool:: 
Voici le code:


```

```

Merci encore une fois.
Grgory

----------


## Gregory_007

Il y a seulement un petit truc qui marche pas, pas bien grave, mais quand mme.
Quand je me connecte, j'envoie mes donns et que je me dconnecte aprs, le programme se ferme tout seule.
Ou est le problme ?
De plus, je ne pensais pas me rendre la tout de suite, mais bon, il est surement possible avec une rsolution dns(c'est rglet), une adresse ip spcifique(celle de ma carte arduino) et un port spcifique (ex:123) d'envoyer un string par internet en udp. J'ai pas bien trouv, pourrais-tu me diriger stp ?
Merci
Grgory

----------


## GuruuMeditation

Le programme s'arrte tout seul, sans message?

Pour envoyer une chaine, tu peux utiliser system.text.encoding.utf8encoding. Il y  de fonctions pour transformer un texte en byte et inversment.

----------


## Gregory_007

J'ai trouv 1 de mes problmes. J'ai pas mis ceci

```
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
```

 au bonne endroit. Maintenant, je peux me connecter et me dconnecter sans problme mais avec 

```
socket.Shutdown(SocketShutdown.Both);
```

 car socketClose(), ferme toujours le programme sans aucun message d'erreur. J'ai lu que a pouvait tre normale, qu'il fallait attendre un certain temps avant de le fermer, car il pourrait y avoir des paquets en transit, mais aprs 2 minutes d'attend, toujours le mme problme. As-tu une ide pourquoi ? est-ce que socket.Shutdown(SocketShutdown.Both); est suffisant ?
Merci
Grgory

----------


## Gregory_007

Bonjour
Il y a dj quelque temps que j'ai pos mes questions sur les sockets, mais j'en aurais encore quelques une.

Prsentement, j'ai reli mon ordinateur directement avec une carte arduino par un port ethernet et ma communication est numro 1. Seulement, si je veux pass par le routeur pour communiqu avec cette carte et le wifi de mon ordi, cela ne marche plus ou presque. Quand je ping la carte arduino avec ms-dos en wifi, cela fonctionne (avant que je face quoi que ce soit d'autre). Mais des que je fais fonctionner mon programme, il ne se passe rien et je ne peux plus pingn la carte aprs pendant un certain temps et temps que mon programme fonctionne. Je me demandais si je devais spcifier une passerelle et un masque de rseau au programme pour que cela fonctionne ?
Si oui, pourriez vous me donn une piste a suivre.


```

```

Merci
Grgory

----------


## Bluedeep

Bonjour

Non, la passerelle est connue par ta stack IP a priori.

Quand tu fais un *tracert* vers ta carte le passage par la passerelle est bien mentionn ?

Je vois peut tre un problme li au fait que tu utilises le port HTTP en balanant des choses qui n'ont rien  faire sur ce port (UDP et contenu). Il est possible de le routeur carte dans ce cas ces packets qu'il considre comme "louches". (sous toutes rserves).

----------


## Gregory_007

Bonjour Bluedeep

Quand tu me dis ceci:


```
 Quand tu fais un tracert vers ta carte le passage par la passerelle est bien mentionné ?
```

Je ne suis pas sur de comprendre. Je n'ai pas fais une redirection vers ma carte dans mon routeur ( port 80 vers ma carte ). Si c'est cela que tu me demandais. Je ne pensais pas que cela t important.

J'ai essay de mettre mon programme sur un autre ordi pour communiquer entre pc, en changeant bien les adresse ip,  mais cela ne fonctionne pas plus.

Je vais essayer ta thorie de mettre un autre port, on ne sait jamais.
Je t'en redonne des nouvelles.
Merci
Grgory

----------


## nnovic

Hello,

Concernant les ports, je crois me souvenir que tous les ports de 0  1024 sont standardiss pour des utilisations bien prcises (comme 80 pour le HTTP, par exemple). Habituellement, quand on dveloppe des communications non-standards, on utilise un numro de port au-dessus de 1024.

A+!

----------


## Gregory_007

Bonjour

J'ai donc ouvert les port 2345 a 2346 pour mes 2 adresses ip (comme pour un serveur ftp par exemple).

Ordi 1: visual studio
Ordi 2: ordi 2 (lol)

Quand j'ai mis mon programme sur ordi 2 et que j'ai voulu envoyer un message, le programme a plant. Sur l'ordi 1, tout fonctionne. Aucun message n'a t reu.

J'ai pris le fichier .exe qui ce trouve dans bin/debug.

Je sais que si je connecte ma carte arduino sur le port ethernet cela fonctionne, donc on peut en dduire que temps que je ne passe pas par le routeur, cela fonctionne.

Avez-vous une autre ide ?
Merci
Grgory

----------

