
Envoyé par
ram_0000
En fait, c'est parce que le serveur "écoute" plus qu'il ne "bind" un port local. Il ecoute un port, recoit des données sur ce port et peut répondre à ces données.
Ce que tu m'as dit sur le bind() m'a intrigue et j'ai fait quelques tests dont certains resultats m'echappent :
_ J'utilise les 2 memes instances de la classe SOCKET_UDP que j'avais utilisees dans mon message precedent
_ Je lance d'abord le serveur
_ Puis avec le client j'envoie le message "test"
_ Et je reponds "retest" depuis le serveur

Envoyé par
resultat essai1
-------- client ---------
INFO: socket 3 créé en mode UDP/IP
INFO: adressage defini
ERREUR: impossible de lier le socket à un point de communication
ip demandee: 127.0.0.1
ip obtenue: 127.0.1.1
port: 4212
test
------ serveur -------
INFO: socket 3 créé en mode UDP/IP
INFO: adressage defini
ip demandee:
ip obtenue: 127.0.1.1
port: 4212
127.0.0.1 > test
retest
127.0.0.1 > retest
Le message d'erreur indique que le bind() du client n'a pas reussi. Normal, le systeme a voulu attribuer la session que le serveur utilisait deja.
Le client envoie un message "test" qui est recu par le serveur. Par contre, le serveur recoit le message "retest" qu'il envoie. Normal, le serveur a un adressage sur l'adresse locale.
Dans le second essai, j'ai passe en argument au recvfrom() l'adresse utilisee lors de l'adressage initial. De sorte que, lorsque le serveur recoit un message, la fonction recvfrom() renseigne la structure sockaddr qui sera utilisee lors de l'appel de sendto(). Comme ca le serveur repond au dernier ip qui lui a envoye un paquet.

Envoyé par
resultat essai2
-------- client ---------
INFO: socket 3 créé en mode UDP/IP
INFO: adressage defini
ERREUR: impossible de lier le socket à un point de communication
ip demandee: 127.0.0.1
ip obtenue: 127.0.1.1
port: 4212
test
127.0.0.1 > retest
------ serveur -------
INFO: socket 3 créé en mode UDP/IP
INFO: adressage defini
ip demandee:
ip obtenue: 127.0.1.1
port: 4212
127.0.0.1 > test
retest
Il y a toujours le meme conflit au niveau du bind(). Mais cette fois le client recoit la reponse "retest" du serveur.
Comment le client peut-il recevoir un message alors que le bind() n'a pas ete effectue ?
Pourquoi, dans mon premier essai, seul le serveur a recu son propre message alors que, dans mon cas particulier (loopback), le client a exactement la meme adresse que le serveur (127.0.1.1) mais ce dernier n'a rien recu ?
Partager