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

Windows Discussion :

passage d'une socket a un autre processus sous windows


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 12
    Points
    12
    Par défaut passage d'une socket a un autre processus sous windows
    Bonjour a tous,

    Je developpe une appli video client - serveur en C. Le serveur se trouve sur une machine windows ecoutant sur un certain port, et je voudrais qu'un nouveau processus soit creer a l'arrivee de nouveaux clients, chaque client parlant ainsi a son serveur par l'intermediaire d'une socket.

    Sous Unix (Linux, Mac, ...), pas de probleme, je fait un fork
    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
    int i;
    while( true )
      {
        char url_demandee[MAXBUFFER];
        /* RAZ */
        bzero((char *) &adrsock, sizeof(adrsock));
        adrsock.sin_family = AF_INET;
        adrsock.sin_addr.s_addr = INADDR_ANY;
        lg_ad_from=sizeof(ad_from);
    
        socket_client = accept(sock,(struct sockaddr *) &adrsock, &lg_nom_sock);
        if&#40; socket_client < 0&#41;
        &#123;
          perror&#40;"Echec dans l'acceptation d'un client"&#41;;
          return -1;
        &#125;
        printf&#40;"Client accepted on port &#58; %i\n", ntohs&#40;adrsock.sin_port&#41;&#41;;
        i = fork&#40;&#41;;
        if&#40;i&#41;&#123;
        // I am the child !
            communicate&#40;socket_client&#41;;
            exit&#40;1&#41;;
        &#125;
      &#125;
    Seulement voila, y a pas de fork sous windows. Alors le seul moyen est de lancer une commande a l'aide de CreateProcess

    Alors j'appel l'exe vipserv.exe en lui passant en parametre le numero de la socket
    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
    char _cmd&#91;512&#93;;
        sprintf&#40;_cmd,"vipserv.exe -s %i",socket_client&#41;;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory&#40; &si, sizeof&#40;si&#41; &#41;;
        si.cb = sizeof&#40;si&#41;;
        ZeroMemory&#40; &pi, sizeof&#40;pi&#41; &#41;;
        // Start the child process.
        if&#40; !CreateProcess&#40; NULL,   // No module name &#40;use command line&#41;.
                            _cmd, // Command line.
                            NULL,             // Process handle not inheritable.
                            NULL,             // Thread handle not inheritable.
                            FALSE,            // Set handle inheritance to FALSE.
                            0,                // No creation flags.
                            NULL,             // Use parent's environment block.
                            NULL,             // Use parent's starting directory.
                            &si,              // Pointer to STARTUPINFO structure.
                            &pi &#41;             // Pointer to PROCESS_INFORMATION structure.
          &#41;
        &#123;
          printf&#40; "CreateProcess failed &#40;%d&#41;.\n", GetLastError&#40;&#41; &#41;;
        &#125;
    Mais ca marche pas vu que la socket n'est pas relie a son process ID ...

    Quelqu'un a t'il une idee ?

    PS : J'ai essaye de refaire un bind dans le nouveau processus mais ca marche pas, le port est deja ouvert et la socket est active.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    bonjour,

    C'est un choix que tu as fais de passer par les process que de passer par les threads ? CreateThread permet plus facilement de passer des paramètres ( y'a un argument pour)
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un socket est un handle comme un autre, il peut donc être dupliqué.
    Il me semble bien qu'un socket peut aussi être héritable, ce qui fait qu'un socket dupliqué avec le paramètre fInheritHandle à TRUE, devrait être hérité par le processus fils...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Oui la socket est héritable mais cela n'empeche pas qu'il faut la passer en paramètre au processus qui va l'utiliser.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par hegros
    bonjour,

    C'est un choix que tu as fais de passer par les process que de passer par les threads ? CreateThread permet plus facilement de passer des paramètres ( y'a un argument pour)
    Merci pour ta reponse, je fonctionne pour le moment en thread mais ca ne me convien pas. Si un thread plante, tout plante. De plus j'utilise une librairie qui a une legere fuite memoire et je voudrais que la memoire soit libere quand le client part, du coup a la fermeture du processus fils.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Médinoc
    Un socket est un handle comme un autre, il peut donc être dupliqué.
    Il me semble bien qu'un socket peut aussi être héritable, ce qui fait qu'un socket dupliqué avec le paramètre fInheritHandle à TRUE, devrait être hérité par le processus fils...
    Merci pour ta reponse, je vais essayer ca.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par hegros
    Oui la socket est héritable mais cela n'empeche pas qu'il faut la passer en paramètre au processus qui va l'utiliser.
    Pas de probleme pour ca, je peux passer le numero de la socket en parametre.

    PS : On dit un ou une socket ?

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Une socket...

    Exemple:

    "La socket n'est pas fermée"

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par sleg
    Citation Envoyé par hegros
    Oui la socket est héritable mais cela n'empeche pas qu'il faut la passer en paramètre au processus qui va l'utiliser.
    Pas de probleme pour ca, je peux passer le numero de la socket en parametre.

    PS : On dit un ou une socket ?
    si tu peux passer en paramètre le numéro de socket ton problème est résolu
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup

    Pour resumer, je passait bien la socket mais au moment de l'appel du processus, je n'avais pas positionne le flag bInheritHandles a TRUE.

    Pour info, et pour les autres :

    Mon main
    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
    26
    27
    28
    29
    30
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
      int i;
    
      WSADATA WSAData;
      WSAStartup&#40;MAKEWORD&#40;2,0&#41;, &WSAData&#41;;
    
      serv = new VipServ&#40;&#41;;
      for &#40;i=1;i<argc;i++&#41;
      &#123;
        string command&#40;argv&#91;i&#93;&#41;;
        if &#40;command.empty&#40;&#41;&#41;
        &#123;
          break;
        &#125;
        else if &#40;command == "-s"&#41;
        &#123;
          i++;
          // Processus fils qui communique
          return serv->communicate&#40;atoi&#40;argv&#91;i&#93;&#41;&#41;;
        &#125;
        else if &#40;command == "-p"&#41;
        &#123;
          i++;
          // Le demon qui ecoute et qui cree les fils
          return serv->deamon&#40;htons&#40;atoi&#40;argv&#91;i&#93;&#41;&#41;&#41;;
        &#125;
        else return 0;
      &#125;
    &#125;

    PS : Ne pas oublier
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    Pour le pere et le fils

    La creation du fils : Appel de vipserv.exe -s <no de la socket>
    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
    char _cmd&#91;512&#93;;
        sprintf&#40;_cmd,"vipserv.exe -s %i",socket_client&#41;;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory&#40; &si, sizeof&#40;si&#41; &#41;;
        si.cb = sizeof&#40;si&#41;;
        ZeroMemory&#40; &pi, sizeof&#40;pi&#41; &#41;;
        // Start the child process.
        if&#40; !CreateProcess&#40; NULL,   // No module name &#40;use command line&#41;.
                            _cmd, // Command line.
                            NULL,             // Process handle not inheritable.
                            NULL,             // Thread handle not inheritable.
                            TRUE,            // Set handle inheritance to FALSE.
                            0,                // No creation flags.
                            NULL,             // Use parent's environment block.
                            NULL,             // Use parent's starting directory.
                            &si,              // Pointer to STARTUPINFO structure.
                            &pi &#41;             // Pointer to PROCESS_INFORMATION structure.
          &#41;
        &#123;
          printf&#40; "CreateProcess failed &#40;%d&#41;.\n", GetLastError&#40;&#41; &#41;;
        &#125;

    Et le serveur est lance avec vipserv.exe -p <no port>

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/06/2015, 16h48
  2. [OWL] Passage d'une ontologie OWL vers un processus BPEL
    Par <yassou> dans le forum Ontologies
    Réponses: 0
    Dernier message: 02/05/2015, 20h44
  3. [Débutant] Probleme avec passage d'une form a l'autre!
    Par java123 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 12/07/2013, 12h19
  4. Réponses: 2
    Dernier message: 13/09/2010, 10h55
  5. Peut on acceder à une image d'une autre application sous windows?
    Par pointer dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 19/04/2006, 12h17

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