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.