IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

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


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Socket Exception : The requested address is not valid in its context
    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

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    As-tu testé en supprimant les pare_feu ?

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Oui, j'ai désactivé les pare-feux des 2 ordinateurs, qui sont en temps normal tous les 2 équipés de Zone-Alarm et du firewall Windows.

    Information supplémentaire : le 1er ordi est sous Windows 7 Pro 32 bits, et le 2ème sous Windows XP Home 32 bits.

    Mais je pense plutôt que cela vient de la manière d'utiliser les sockets...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Par défaut
    Bonjour,

    Après une petite recherche, je suis tombé la dessus : http://bytes.com/topic/c-sharp/answe...id-its-context

    You are mixing apples with oranges. The TcpClient constructor that
    uses the IPEndPoint defines a local endpoint for the socket to bind
    to, while the constructor that uses the string defines a remote
    endpoint for the socket to connect to. Thus, the first constructor is
    looking to bind the socket to the local IP address and port specified
    in the IPEndPoint object. Since you gave it a remote IP address it
    couldn't perform the task and threw the Exception.
    Donc une solution possible serait de donner au constructeur de TcpClient directement la string avec l'adresse plutot qu'une IPEndPoint.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Alors là je suis vraiment étonné !
    Effectivement pour les TcpClient il suffit d'utiliser cet autre constructeur...
    Partant de ce principe j'ai essayé de "tatonner" entre les différents constructeurs, et voilà comment je suis arrivé à résoudre mon problème :

    1. Pour les TcpClient :
      Changer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      ctrl = new TcpClient();
      ctrl.Connect(IPAddress.Parse(ipServer), port);
      En :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ctrl = new TcpClient(ipServer, port);
    2. Pour les TcpListener :
      Changer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      dataListen = new TcpListener(IPAddress.Parse(ipServer), port);
      En :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      dataListen = new TcpListener(port);
      (cette solution est "deprecated")

    3. Pour les UdpClient :
      Changer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      ctrl = new UdpClient();
      ctrl.Connect(IPAddress.Parse(ipServer), port);
      En :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ctrl = new UdpClient(ipServer, port);
    4. Pour la Socket d'écoute Udp :
      Changer :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      data = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
      data.Bind(new IPEndPoint(IPAddress.Parse(ipServer), portListen));
      En :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      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 :]
    En tout cas un grand merci ketan !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/11/2011, 23h25
  2. Réponses: 3
    Dernier message: 28/07/2010, 16h34
  3. The X Command is not valid in this SAS session
    Par Dr Byby'San dans le forum SAS Base
    Réponses: 6
    Dernier message: 17/06/2010, 05h17
  4. Réponses: 0
    Dernier message: 15/12/2009, 09h54
  5. Réponses: 3
    Dernier message: 25/09/2006, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo