Socket Exception : The requested address is not valid in its context

neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010 - 13 avril 2010 à 21:48
neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010 - 14 avril 2010 à 11:44
Bonjour à tous,

Je développe un client pour une application réseau en C#, et jusqu'à présent je faisais mes test en local : le serveur et le client tournaient tous les deux sur la même machine (la mienne).

Seulement, maintenant que mon application est (presque) finie, j'ai tenté de passer sur 2 ordinateurs différents : le serveur tourne sur une autre machine que le client.Le problème c'est que dans ce cas, mes sockets me renvoie l'exception suivante :

Source: System
Message: The requested address is not valid in its context


J'utilise plusieurs types C# de socket dans mon application : les classes UdpClient, TcpClient, TcpListener et Socket.
Ainsi que plusieurs protocoles : TCP, UDP et IP MultiCast.

Quand je passe sur 2 machines différentes : TCP et UDP ne fonctionnent plus et me renvoie l'exception ci-dessus, mais IP Multicast continue de fonctionner !

Encore une chose en ce qui concerne la communication client-serveur : j'utilise 2 sockets dans chaque cas de figure (TCP ou UDP), une pour une connexion de contrôle qui me permet d'envoyer des commandes au serveur, et une pour une connexion de données qui me permet de recevoir les données envoyées par le serveur. Voilà comment j'initialise mes différentes Socket :

Pour TCP : (ne marche qu'en local)
// On met en place l'écoute pour la connexion de données
dataListen =  new TcpListener(IPAddress.Parse(ipServer), portData);
dataListen.Start();

// On se connecte au serveur pour la connexion de controle et on envoie notre demande de connexion
ctrl = new TcpClient();
ctrl.Connect(IPAddress.Parse(ipServer), portCtrl);

// on accepte la connnexion du serveur pour la connexion de données
data = dataListen.AcceptTcpClient();


Pour UDP : (ne marche qu'en local)
// On met en place la socket d'écoute UDP (pour la connexion de données)
data  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
data.Bind(new IPEndPoint(IPAddress.Parse(ipServer), portData));

// On met en place la socket UDP pour la connexion de ctrl
ctrl =  new UdpClient();
ctrl.Connect(IPAddress.Parse(ipServer), portCtrl);


Pour IP MULTICAST (une seule connexion de données dans ce cas, fonctionne en local et en réseau) :
data  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
data.Bind(new IPEndPoint(IPAddress.Any, portData));
data.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(ipServer), IPAddress.Any));


Voici maintenant des détails sur le client, serveur et le réseau :

* Le client ainsi que le serveur sont tous les deux pour Windows
* Premier test : Les 2 ordinateurs sont reliés par une freebox, et chacun répond au PING de l'autre
* Deuxième test : Les 2 ordinateurs sont directements reliés par un cable, et chacun répond au PING de l'autre
* Quand je suis "en local", tout marche, avec l'IP 127.0.0.1 ou l'adresse de la machine locale 192.168.0.10
* Quand je suis "en réseau", mon IP est 192.168.0.10 et celle du serveur est 192.168.0.11, un exemple d'IP pour le multicast est "225.100.110.12"



Voilà,
Un grand merci d'avance à tous ceux qui ont lu ce post et qui pourront m'aider.
++
neophell

1 réponse

neophell Messages postés 4 Date d'inscription mardi 20 janvier 2009 Statut Membre Dernière intervention 14 avril 2010
14 avril 2010 à 11:44
Bon je me répond à moi même, après avoir trouvé la solution sur un autre forum :


1. Pour les TcpClient :
Changer :
ctrl = new TcpClient();
ctrl.Connect(IPAddress.Parse(ipServer), port);
En :
ctrl = new TcpClient(ipServer, port);

2. Pour les TcpListener :
Changer :
dataListen = new TcpListener(IPAddress.Parse(ipServer), port);
En :
dataListen = new TcpListener(port);
(cette solution est "deprecated")

3. Pour les UdpClient :
Changer :
ctrl = new UdpClient();
ctrl.Connect(IPAddress.Parse(ipServer), port);
En :
ctrl = new UdpClient(ipServer, port);

4. Pour la Socket d'écoute Udp :
Changer :
data = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
data.Bind(new IPEndPoint(IPAddress.Parse(ipServer), portListen));
En :
data = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
data.Bind(new IPEndPoint(IPAddress.Any, portListen));


Donc maintenant ça marche, mais je ne comprends toujours pas pourquoi :]
0
Rejoignez-nous