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
Seulement voila, y a pas de fork sous windows. Alors le seul moyen est de lancer une commande a l'aide de CreateProcess
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( socket_client < 0) { perror("Echec dans l'acceptation d'un client"); return -1; } printf("Client accepted on port : %i\n", ntohs(adrsock.sin_port)); i = fork(); if(i){ // I am the child ! communicate(socket_client); exit(1); } }
Alors j'appel l'exe vipserv.exe en lui passant en parametre le numero de la socket
Mais ca marche pas vu que la socket n'est pas relie a son process ID ...
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[512]; sprintf(_cmd,"vipserv.exe -s %i",socket_client); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line). _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 ) // Pointer to PROCESS_INFORMATION structure. ) { printf( "CreateProcess failed (%d).\n", GetLastError() ); }
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.
Partager