Utilisation port UDP depuis le port 6667 vers le port 6667...

cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008 - 21 avril 2005 à 22:49
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 23 avril 2005 à 04:18
Bonjour,



J'essaye de recréer un logiciel qui utilise une connexion internet et
qui permet un dialogue avec d'autres personnes sur le net. J'ai donc
sniffé ma connexion avec le logiciel Ethereal, et j'ai réussi à faire
une demande TCP (port HTTP) au serveur, et j'ai obtenu la réponse.

Celui-ci m'envoie une série d'adresses IP (ce sont les gens connectés sur le logiciel en question).

Je stocke donc toutes ces adresses dans un tableau, pour les manipulations suivantes!



A ce moment, le logiciel que j'essaye de recréer envoie une requête UDP
à chaque personne connecté (il peut y en avoir plusieurs centaines).
Or, cette requête est envoyée depuis le port 6667 et les données sont
elles même reçues sur le port 6667.



Voilà, je voulais savoir, car moi je n'ai pas réussi, comment faire
pour envoyer des données en UDP (et aussi, si ça marche, en TCP) depuis
un port spécifique, ici, le port 6667. Car moi, je peux choisir la
destination de ma requête vers le port 6667 mais ma requête est envoyée
depuis un port aléatoire, ou tout du moins pseudo aléatoire, car je ne
comprends pas comment le port d'envoie est choisi par mon programme...

En envoyant depuis un port aléatoire de mon pc, je n'arrive pas à
recevoir les données des autres personnes! En tout cas, je n'ai pas
réussi!

J'ai essayé de contourner cette défaillance de mon programme en liant
(avec bind) dans un premier temps un port UDP, puis en envoyant les
données, mais comme ceci, ça ne marche toujours pas.

Pourtant, je pense que je fais toutes les étapes correctement, mais je
peux attendre autant de temps que je veux, je ne reçois aucune réponse
des autres personnes connectées.



Donc je vous appel au secours, j'espere que quelqu'un pourra me répondre.



Si vous souhaitez me contacter par mail pour de plus amples informations sur le programme, etc... alors n'hésitez pas.



En vous remerciant.

JB

6 réponses

cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
21 avril 2005 à 23:15
Re bonjour,


Je viens de réessayer mon programme en sniffant la connection avec ethereal, mes données sont bien envoyées à chaque personne depuis un port aléatoire (ici le 1577) vers le port 6667...
Or, en attendant un peu, je reçois des données vues par le logiciel ethereal qui me disent "destination port unreachable" par le protocole ICMP comme ci le port de l'autre côté était fermé, alors que normalement, les personnes doivent utiliser en ce moment le logiciel de communication qui doit me permettre de leur envoyer des données sur le port 6667...
Est-ce que le logiciel reconnait que je n'utilise pas le même logiciel, mais un logiciel qui est seulement une copie que j'ai faite? Est-ce possible?
Dans ce cas la, je ne devrait peut être pas recevoir "destination port unreachable" par le protocole ICMP mais plutot un truc du genre "le logiciel d'en face ne comprends pas ce que vous dites" par UDP?

Est ce que je peux utiliser une même socket pour envoyer des données en UDP vers plusieurs personnes? Ne dois je pas créer autant de socket que de personnes à contacter?

Est ce que je peux recevoir les données en UDP sur la même socket que celle qui m'a servie à l'envoie de mes données? Ou au contraire, dois-je recréer une socket spécifique à la réception des données (toujours sur le port 6667) et fermer celle qui m'a servie à envoyer les données?

Si j'ai oublié des choses, vous pouvez me suggérer autant d'idées que vous le souhaitez, je suis preneur ;-)

Merci pour vos réponses.

JB
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 avril 2005 à 18:02
Salut,


Une fois que la connexion tcp est établie avec le serveur, celui ci te renvoie une liste d'ip. Ton logiciel, pour determiner si les ip sont bien des clients valides, envoie un paquet UDP a chaque client. Si le client existe, il réponds, sinon, le routeur le plus proche du "client" te retourne un message d'erreur icmp, ce qui se traduit par un recvfrom(...) qui échoue et qui retourne l'erreur destination unreachable.

La notion de connexion n'existe pas en UDP, donc oui tu peux envoyer des centaines de messages depuis le meme socket, et oui tu peux recevoir tout les messages qui arrivent sur le port 6667 de ta machine a partir d'un seul socket.

Donc il faut créer un socket UDP, le binder sur le port souhaité (si tu le bind pas explicitement, le port local sera choisi par defaut).
Ensuite tu envoies tes messages avec sendto(...) (le 5eme param est l'addresse de destination du paquet), et tu les recois avec recvfrom(...) (le 5eme param est l'adresse du client qui t'a envoyé le message).
0
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
23 avril 2005 à 01:00
Salut, et merci aardman, grâce à tes explications j'ai pu trouver
comment envoyer des données en UDP depuis le port 6667, et cette
fois-ci, je reçois bien les réponses des personnes auxquelles j'essaye
de me connecter...

Je n'y arrivait pas au début, mais c'est parce qu'il faut lier la
socket avec bind et surtout une structure acceptant toutes les adresses
internet (INADDR_ANY). Au départ, je faisais un bind pour chaque
adresse, et ceci ne marchait pas. Je pense qu'on a le droit de
n'effectuer qu'un appel à bind(), c'est pour ça que le programme
plantait.



Donc je vois bien les réponses des autres personnes grâce au logiciel
Ethereal (petit logiciel bien utile j'avoue), mais lorsque j'essaye de
les récupérer sur mon programme avec recvfrom(), alors la fonction
plante, elle me retourne une erreur décrite par le chiffre 10014
(WSAGetLastError). Ce qui veut dire WSAEFAULT : The buf (2eme) or from (5eme) parameters are not part of the user address space,
or the fromlen (6eme) parameter is too small to accommodate the peer address.

Or je ne vois pas comment je peux y remedier.



Dans les paramètres de cette fonction, j'ai donc utilisé la socket
créée pour le protocole UDP (qui était préalablement liée avec bind sur
toutes les adresses internet (INADDR_ANY) et sur le port 6667), puis un
buffer de 10000 char, puis la taille de ce buffer, puis le chiffre 0
(un flag inutile pour moi je pense), puis une structure SOCKADDR *,
puis la taille de cette structure.



Voilà, la fonction ne passe pas.

Est ce qu'il faut que je créée une deuxième socket? Est-ce qu'il y a un
buffer qui ne va pas? Qu'est ce que le "user address space" comme il
est écrit dans la définition de l'erreur?



Si vous avez une idée, je suis preneur, car je me prends la tête dessus, mais ça ne fonctionne pas...


JB
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 avril 2005 à 01:14
Salut,
Tu peux appeler bind autant de fois que tu veux, mais il faut (dans 99% des cas) passer INADDR_ANY comme adresse locale.

Sinon pour l'erreur, note bien que le dernier param de recvfrom() c'est pas un int mais un int* qui contient la taille de la structure sockaddr_in que tu as passé en 5eme param.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jb60 Messages postés 55 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 4 août 2008
23 avril 2005 à 01:36
Re,



Encore merci pour ton aide si rapide, mais maintenant je n'ai plus
l'erreur 10014 mais 10054, ce qui veut dire que la connection a été
terminée par le peer...

Je ne comprends pas, vu que je reçois des données quand la fonction
recvfrom retourne (fonction bloquante je crois), alros je devrais avoir
rempli le buffer, et donc les données reçues ne peuvent pas être une
connection fermée...

Et ceci se produit à chaque fois (ou presque) alors que sur ethereal, les données reçues sont bien là!

Moi les quelques fois où je n'ai pas l'erreur 10054, je reçois des données qui contiennent la chaine "0" seulement.

Comprends rien, vais je arriver à finir cette fonction un jour????

:-(



Mais encore merci à toi aardman

JB
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 avril 2005 à 04:18
Salut,
La notion de connexion n'existe pas en UDP, alors comment une connection pourrait etre elle terminée par le peer ?
Les messages d'erreurs sont a interpreter differement selon le protocol utilisé.
Pour 10054, je vois sur msdn: On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message.
Autrement dit tu as envoyé un paquet UDP a une adresse inexistante/invalide, et ca risque d'arriver souvent puisque d'apres ce que j'avais compris ces paquets UDP servent de "sonde" pour savoir si l'adresse distante existe bien.
0
Rejoignez-nous