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 :

Socket sur une même machine, possible ?


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut Socket sur une même machine, possible ?
    Bonjour,

    Pourriez-vous me dire si ces possible d'utiliser les sockets pour communiquer entre deux processus sur une même machine ? ( comme un pipe ). Ou les machines doivent forcément ne pas être les mêmes ?

    Merci.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est possible.

    Mais ca utilise un port réseau, qui ne doit pas être utilisé par autre chose.
    C'est d'ailleurs une des possibilités pour empêcher un programme d'être lancé plusieurs fois (si la socket "serveur" ne peut pas être ouverte, alors return/exit)

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut
    Pourquoi utiliser un port réseau puisque la communication se fais sur la même machine avec donc la même machine ? je pensai à créer une socket ( un fichier ), écrire sur ce fichier puis lire dessus avec un autre processus.

    Exemple :
    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
    22
    23
    24
    25
    static int	my_sockfile(void)
    {
    	int				s;
    	struct sockaddr_un	name;
     
    	if ((s = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
    		printf(ERROR);
    	name.sun_family = AF_LOCAL;
    	my_strncpy(name.sun_path, "SOCKET", sizeof(name.sun_path));
    	if (bind(s, (const struct sockaddr *)&name, sizeof(name)) == -1)
    	{
    		close(s);
    		printf(ERROR);
    	}
    	return (s);
     
    int main(void)
    {
            int sock = my_sockfile();
            int ret = write (sock, "Bonjour", 7);
            if (ret == -1)
                 perror("Write : "); //Destination address required
            return 0;
    }
    }
    Cependant j'ai l'erreur "Destination address required" lors de l'écriture sur le socket, aprés je ne vois pas l'intêret de listen/accept vu que ces un processus de la même machine. (fork)

    Merci pour les précisions.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par sbill Voir le message
    Pourquoi utiliser un port réseau puisque la communication se fais sur la même machine avec donc la même machine ? je pensai à créer une socket ( un fichier ), écrire sur ce fichier puis lire dessus avec un autre processus.

    Merci pour les précisions.
    Ce qu'il te faut, c'est un tube (pipe), nommé ou anonyme. Sous UNIX, c'est même la première technique de communication inter-processus que l'on présente réellement.

    Si le second processus est engendré par le premier, alors il faut utiliser l'appel pipe() qui renvoie deux descripteurs de fichiers : un en écriture, l'autre en lecture. Tout ce qui est envoyé dans le premier peut être lu depuis le second. Les données peuvent transiter par un tampon de typiquement 4096 octets mais en règle générale, les appels sont bloquants par défaut : ils restent en attente si l'homologue n'est pas encore au rendez-vous. Le principe général consiste donc à appeler pipe(), à créer le processus fils avec fork() qui hérite donc des mêmes descripteurs, puis à fermer avec close() de chaque côté le descripteur non utilisé sur les deux hérités.

    Remarque importante : un tube est unidirectionnel. Il faut en ouvrir deux pour dialoguer dans les deux sens.

    Les sockets sont une extension du principe des descripteurs de fichiers et des tubes, développé par BSD et proposé comme modèle de communication inter-processus, au moment où SysV proposait ses IPC. Ce modèle unifie les communications en se basant sur les principes existants, en généralisant d'emblée la communication bidirectionnelle (déjà possible sur les fichiers ordinaires) et en séparant distinctement les descripteurs d'un côté et le domaine dans lequel ils sont censés exister. C'est donc assez naturellement qu'on a pu les adapter à la gestion du réseau (pour lequel il n'existait pas grand chose d'unifié, hormis les solutions propriétaires) et que l'interface a été portée sur le tard dans le monde Microsoft, essentiellement suite à la démocratisation d'Internet et des applications en TCP/IP, à une époque où c'était encore IPX/SPX qui régnait en maître sur PC.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 85
    Par défaut
    Merci pour la leçon Obsidian

    L'utilisation des pipes ne me pose pas de problème, cependant puis-je en conclure que ce que je veux faire est impossible avec une socket de type AF_LOCAL ?

    De plus, toute les sockets AF_LOCAL doivent également être bindé, listen & accept ? (puis d'un autre coté connect()).

    Je sais que les pipes sont la solutions à mon problème mais actuellement j'apprend le fonctionnement des sockets en profondeur et j'aimerai bien savoir ce qui est possible et pas possible. J'ai jamais eu l'occasion d'utiliser les sockets en mode AF_LOCAL (uniquement AF_INET et AF_INET6).
    Si tu pourrais me dire, pourquoi mon code renvoie l'erreur mentionné, je t'en serai reconnaissant.

    Merci.

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par sbill Voir le message
    toute les sockets AF_LOCAL doivent également être bindé, listen & accept ? (puis d'un autre coté connect()).
    c'est le mode opératoire pour utiliser les sockets, c'est comme dire "le fichier est dans le même répertoire que mon exécutable, y'a pas plus court que open/read/write/close ?"

    pour la petite info les sockets "locales" (bindées sur localhost, 127.0.0.1 etc.) ne sortent pas de la carte réseau, et les services ne sont donc pas accessibles depuis internet non plus

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonjour,

    Citation Envoyé par sbill Voir le message
    Bonjour,
    Pourriez-vous me dire si ces possible d'utiliser les sockets pour communiquer entre deux processus sur une même machine ? ( comme un pipe ). Ou les machines doivent forcément ne pas être les mêmes ? Merci.
    Citation Envoyé par leternel Voir le message
    C'est possible.
    Mais ca utilise un port réseau, qui ne doit pas être utilisé par autre chose.
    Justement ! Les sockets, en principe, ne sont pas obligés d'être forcément déclarés dans le domaine réseau. La communication inter-processus est justement l'objectif principal des sockets UNIX, dont l'espace est celui du système de fichiers.

    C'est d'ailleurs une des possibilités pour empêcher un programme d'être lancé plusieurs fois (si la socket "serveur" ne peut pas être ouverte, alors return/exit)
    Oui, mais c'est justement ce qu'il ne faut pas faire : c'est une horreur pour les administrateurs système et sécurité : il faut configurer les firewalls pour tenir compte de ces applications et même au sein d'un même réseau, il faudrait carrément modifier la politique de sécurité de la machine elle-même, sinon la machine voisine pourrait perturber le travail de l'utilisateur avec un simple telnet, en accaparant le port concerné avec une tentative de connexion. Et même sans aller jusque là, cela interdit de fait à l'application d'être utilisée sur une même machine mais depuis deux sessions utilisateur distinctes. C'est déjà préjudiciable sur une machine personnelle, ça devient rédhibitoire quand la machine en question est un serveur : un seul connecté à la fois pourrait utiliser l'application.

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

Discussions similaires

  1. Multi-instance Oracle sur une même machine
    Par dhtlse07 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/11/2007, 17h20
  2. 2 serveurs Mysql sur une même machine
    Par soumou dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 26/03/2007, 13h20
  3. Plusieurs serveurs d'application Jboss sur une même machine
    Par Empty_body dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 13/02/2007, 15h44
  4. Plusieurs instances en cluster sur une même machine
    Par Onarap dans le forum Wildfly/JBoss
    Réponses: 3
    Dernier message: 25/10/2006, 16h42
  5. installation de deux serveurs sur une même machine
    Par desdak dans le forum Installation
    Réponses: 1
    Dernier message: 29/06/2005, 23h09

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