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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // 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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // 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) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 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
Partager