Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Raw Socket

Bonjour
Sur cette application, je suis en .NET.
J'ai besoin de surclasser le protocole UDP. En effet, je communique avec un imageur rapide interfacé ethernet, qui me transmet des paquets fragmentés (les images). Celui ci est prévu pour fonctionner sur un segment point à point. Le but est de l'insérer dans un réseau routé. J'ai besoin de récupérer le numéro d'itentification unique du header IP pour fiabiliser le rapatriement des images.
Pour ce faire j'ai créer une classe raw socket, IP, l'ai bindé sur mon interface eth et écrit une usine à paquet. J'envoie un paquet par sendto, qui part bien, l'imageur me répond. Malheureusement, la pile lui répond un paquet ICMP de port "non reachable". Je voudrais savoir s'il est possible avec les raw sockets d'emmettre un paquet UDP et de d'attendre la réponse sur le meme port, et mieux si quelqu'un avait une solution ?
Merci
Lu letchideslandes,

En fait, comme tu utilises les raw socket, tu intéragis en couche 3. Donc tu stipules toi même le format de ton entête UDP. C'est pour cela que la pile UDP de ton OS n'ouvre pas le port UDP en écoute, car tu ne passe pas par elle (la pile UDP de ton OS). Ton paquet ICMP est donc normal.

Comment l'éviter ? Il y a deux solutions. Soit tu n'utilise plus les raw socket et tu passes en couche 4. Soit tu démarre un second process qui effectue un listen sur le port source que tu emets.

@+
_SebF - Sébastien FONTAINE
Bon, on va tenter le double thread, va falloir que je synchronise tout ça. Les raw sockets semblent etre la seule solution pour obtenir l'ID du paquet.
Merci et à bientôt
Bon, comme je n'ai besoin que des headers de réception, j'ai créé un UDPClient pour l'envoie de paquet et une raw socket avec l'option RECVALL, pour recevoir les paquets et les trier.
Ca fonctionne très bien avec un seul imageur.
Cependant, lorsque j'instancie 2 imageurs, j'ai un nouveau soucis. Comme je crée 2 classes, je crée 2 raw sockets qui traitent tous les paquet. Pour parer à cela, et eviter de traiter les paquets de l'autre imageur, je passe l'option peek à la méthode receivefrom de la socket. Je lis donc le buffer mais ne l'efface pas.
Maintenant ne me reste plus qu'à trouver comment effacer le datagramme du buffer si et seulement si c'est un paquet qui est issu de la bonne caméra.
J'ai vu une option IO_FLUSH à passer à ma socket, mais je n'ai pas bien compris si elle effacait le dernier datagramme de la pile , ou la pile entière.
Sinon, une autre solution serait de ne créer qu'un seul couple UDPClient Raw socket et de les insérer dans une seule classe partagée. Ca change mon architecture mais si je ne trouve pas mieux ...