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

Réseau C Discussion :

Comment faire fonctionner mes socket en local ET sur un réseau ?


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut Comment faire fonctionner mes socket en local ET sur un réseau ?
    Salut, je dois faire pour un tp un client-serveur en C avec les sockets, et j'ai des interrogations à vous soumettre.

    Tout d'abord, le but du tp : un serveur se connecte et écoute sur un port donné, puis n clients se connectent au serveur (on précise le port et l'adresse du serveur). Lorsqu'un client envoie un message au serveur, le serveur transmet ce message aux (n-1) autre clients.

    Et ma question :
    À la fac, le réseau est constitué d'un gros serveur et de pleins de terminaux, du coup je développe et je teste en local et toutes les adresses sont 127.0.0.1. Et d'après ce que j'ai compris, avec les sockets on identifie les clients uniquement par leur port et leur ip. Comment faire pour résoudre ça ?

    Pour illustrer ce que j'ai commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    fd_set readfds;
    int nfds, nr;
     
    FD_SET(serveur->socket, &readfds);
    nfds = serveur->socket + 1;
    while(1)
    {
    	nr = select(nfds, &readfds, 0, 0, 0);
    	if(nr == -1)
    	{
    		// traitement de l'erreur
    	}
    	else
    	{
    		if(FD_ISSET(serveur->socket, &readfds))
    		{
    			// connexion d'un nouveau client
    			// j'associe une nouvelle socket au client
    		}
    	}
    }
    Le problème, c'est que j'ai plusieurs sockets qui écoutent toutes sur 127.0.0.1 et sur le même port, et donc mon code ne marche pas...


    Ce qui me gène, c'est que ce code ne fonctionne pas en local, mais devrait fonctionner entre différentes machines (j'ai pas testé), et moi je voudrais une solution qui fonctionne dans les deux configurations !


    Quelqu'un a-t-il une idée ? Merci d'avance !!

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    Salut, je dois faire pour un tp un client-serveur en C avec les sockets, et j'ai des interrogations à vous soumettre.

    Tout d'abord, le but du tp : un serveur se connecte et écoute sur un port donné, puis n clients se connectent au serveur (on précise le port et l'adresse du serveur). Lorsqu'un client envoie un message au serveur, le serveur transmet ce message aux (n-1) autre clients.

    Et ma question :
    À la fac, le réseau est constitué d'un gros serveur et de pleins de terminaux, du coup je développe et je teste en local et toutes les adresses sont 127.0.0.1. Et d'après ce que j'ai compris, avec les sockets on identifie les clients uniquement par leur port et leur ip. Comment faire pour résoudre ça ?

    Pour illustrer ce que j'ai commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    fd_set readfds;
    int nfds, nr;
     
    FD_SET(serveur->socket, &readfds);
    nfds = serveur->socket + 1;
    while(1)
    {
    	nr = select(nfds, &readfds, 0, 0, 0);
    	if(nr == -1)
    	{
    		// traitement de l'erreur
    	}
    	else
    	{
    		if(FD_ISSET(serveur->socket, &readfds))
    		{
    			// connexion d'un nouveau client
    			// j'associe une nouvelle socket au client
    		}
    	}
    }
    Le problème, c'est que j'ai plusieurs sockets qui écoutent toutes sur 127.0.0.1 et sur le même port, et donc mon code ne marche pas...
    Il faut créer un thread par client avec son propre contexte (socket client etc.).
    Ce qui me gène, c'est que ce code ne fonctionne pas en local, mais devrait fonctionner entre différentes machines (j'ai pas testé), et moi je voudrais une solution qui fonctionne dans les deux configurations !
    Aucun rapport avec le langage C...

    Un serveur en mode ADDR_ANY peut recevoir des connexions venant de n'importe quelle IP.

    L'adresse IP 127.0.0.1 est le 'local host', c'est à dire la machine sur laquelle tourne le client. Cette adresse existe toujours, même si il n'y a pas réseau physique.
    Elle n'est jamais routée sur le réseau physique.

    Si ta machine dispose d'une connexion réseau, elle a au moins une adresse IP 'réseau local', qui commence par 192.168.x.x ou par 10.0.x.x.

    Cette adresse est visible du réseau local, mais n'est jamais routée sur le réseau distant (Internet, par exemple). Elle est généralement attribuée automatiquement par une des machine du réseau (protocole DHCP).

    Dans le réseau, il doit y avoir une 'passerelle' (gateway), qui permet de se connecter au réseau distant. Celle-ci a au moins 2 interfaces.

    Une locale, qui est raccordée au réseau local (généralement, l'IP x.x.x.1).
    Une 'distante' qui est raccordée au réseau de données longue distance (téléphone, cable, xDSL, etc.). Elle a une adresse IP unique dans le monde. Celle-ci est visible du réseau mondial et est souvent associée à un nom de serveur.

    Cette adresse IP peut être fixe ou attribuée par le fournisseur d'accès.

    Pour qu'une machine du réseau locale soit visible du réseau mondial, il faut faire du port-forwarding, qui est une configuration spéciale de la passerelle si elle a un mode 'routeur'.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et je rajouterais que 127.0.0.1 est l'adresse de TON ordinateur (la machine), pas du port...

    si tu es sous unixoide, dans le fichier /etc/services, tu peux définir (après les 100 et quelques services déjà définis (telnet, ping, etc..) la correspondance (le numéro "virtuel" du port ainsi que le "service" (ton serveur) associé...

    Ainsi, avec un même numéro 127.0.0.1 (ou n'importe quelle adresse IP), tu peux voir jusqu'à ... je ne connais plus la limite, mais au moins 200 process distincts, ..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Faire fonctionner mes sockets sur internet
    Par the_penguin dans le forum Développement
    Réponses: 9
    Dernier message: 22/04/2006, 11h37
  2. [Vs.Net & SQL Serveur] Comment faire fonctionner le Débu
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/08/2005, 19h23
  3. Comment faire fonctionner une scroll bar ???
    Par toto4650 dans le forum MFC
    Réponses: 10
    Dernier message: 18/07/2005, 16h47
  4. [Chat] Comment faire fonctionner Flash 7 sous Debian ?
    Par piff62 dans le forum Evolutions du club
    Réponses: 22
    Dernier message: 07/03/2005, 15h27
  5. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00

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