2010-11-22 10 views
10

He estado siguiendo Beej Networking guide y en la sección del servidor hay una parte del código donde ha llamado una función fork().Sustituto para bifurcar en Windows

if (!fork()) { // this is the child process 
      close(sockfd); // child doesn't need the listener 
      if (send(new_fd, "Hello, world!", 13, 0) == -1) 
       perror("send"); 
      close(new_fd); 
      exit(0); 

Estoy en una máquina de Windows y no puedo conseguir que esa pieza funcione. ¿Qué puedo hacer para resolver esto ?. Mi código es el siguiente.

/* Server */ 
#define _WIN32_WINNT 0x501 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 
#include <sys/types.h> 


using namespace std; 

const int winsockVersion = 2; 
#define BACKLOG 10 
#define PORT "3000" 


int main(void){ 

    WSADATA wsadata; 
    if (WSAStartup(MAKEWORD(winsockVersion,0),&wsadata) == 0){ 
     cout<<"-WSAStartup initialized..." << endl; 

     int status; 
     int sockfd, new_fd; 
     const char yes = '1'; 
     struct addrinfo hints, *res,*loop_find; 
     struct sockaddr_storage their_addr; 
     socklen_t addr_size; 



     memset(&hints,0,sizeof hints); 
     hints.ai_family = AF_INET; 
     hints.ai_socktype = SOCK_STREAM; 
     hints.ai_flags = AI_PASSIVE; 

     if ((status = getaddrinfo(NULL,PORT,&hints,&res)) == 0){ 
      cout<<"-Call to get addrinfo successful!." << endl; 
     } 

     for (loop_find = res; loop_find!=NULL; loop_find = loop_find->ai_next){ 
      if ((sockfd = socket(loop_find->ai_family,loop_find->ai_socktype,loop_find->ai_protocol)) == -1){ 
       cout<<"-Could not create socket." << endl; 
       continue; 
      }else{ 
       cout<<"-Socket Created." << endl; 
      } 

      //clearing in use ports. 
      if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { 
       cout<<"-Couldnt clear blocked port." << endl; 
       perror("setsockopt"); 
       exit(1); 
      } 

      if(bind(sockfd,loop_find->ai_addr,loop_find->ai_addrlen) == -1){ 
       closesocket(sockfd); 
       perror("server: bind"); 
       continue; 
      } 

      break; 
     } 

     if (listen(sockfd,BACKLOG) != -1){ 
      cout<<"-Listening for incoming connections."; 
     } 

     //accept loop. 
     while(true){ 

      socklen_t addr_size = sizeof their_addr; 
      new_fd = accept(sockfd,(sockaddr*)&their_addr,&addr_size); 

      if (new_fd == -1){ 
       perror("accept"); 
       continue; 
      } 

      struct sockaddr new_addr; 
      int len = sizeof new_addr; 
      getpeername(new_fd,&new_addr,&len); 
      cout<<"-Connected to " << new_addr.sa_data << endl; 

      if(!fork()){ //this is a child process 
       closesocket(sockfd); 
       if (send(new_fd,"hello world!!",13,0) == -1){ 
        perror("send"); 
        closesocket(new_fd); 
        exit(0); 
       } 
      } 
      closesocket(new_fd); 

     } 
    } 


    //clear stuff 
    if(WSACleanup() != 0){ 
     cout<<"-WSACleanup unsuccessful" << endl; 
    }else{ 
     cout<<"-WSACleanup successful" << endl; 
    } 


    return 0; 

} 
+6

Cuando código para Windows, Usualmente usas otro tipo de pensamiento. Creo que es mejor mirar tutoriales de Winsock en lugar de esta guía que está utilizando. –

+0

Preguntas relacionadas: [¿Qué es lo más parecido que tiene Windows a fork()?] (Http://stackoverflow.com/questions/985281/), [CreateThread vs fork()] (http://stackoverflow.com/questions/619019 /), [equivalente de fork/chroot para la aplicación de servidor de Windows] (http://stackoverflow.com/questions/1686578/), [¿Dónde se encuentra actualmente la implementación de POSIX de Microsoft Windows 7?] (Http://stackoverflow.com/questions/4746043 /) –

Respuesta

6

fork() obviamente no existe en Windows. En su lugar, necesitará create a new thread o whole new process.

+8

Pero en realidad, simplemente no se diseñan servidores de red como ese en Windows. –

+0

+1 :) Sin duda no lo condonaría. –

+3

fork() no tan obviamente ** existe ** en Windows :) Vea mi respuesta. –

5

fork no existe en Windows. Tienes que usar una API específica de Windows llamada CreateProcess.

Al contrario de fork, CreateProcess necesita la ruta al EXE. Puede recuperar la ruta del EXE actual llamando al GetModuleFileName con un parámetro NULL.

+1

fork() ** existe ** en Windows :) Consulte mi respuesta. –

18

Al contrario de las dos respuestas existentes (de OJ y Vincent Robert) fork() existe en las versiones de gama alta de Windows. Es parte de Subsistema para aplicaciones basadas en UNIX (SUA) anteriormente llamado Microsoft Windows Services para UNIX (SFU), anteriormente llamado Interix.

Citando http://en.wikipedia.org/wiki/Interix, SUA está disponible en

  • Windows Server 2003 R2 (todas las ediciones) - Versión 5.2
  • Windows Vista (Ultimate y ediciones Enterprise) - Versión 6.0
  • Windows Server 2008 (todas las ediciones) - versión 6.0
  • Windows Server 2008 R2 y Microsoft Windows 7 - versión 6.1

Todo lo que tiene que hacer para usar fork() es instalar SUA SDK gratis. Dependiendo de su sistema de destino necesita uno de los siguientes:

También puede echar un vistazo a Does Interix implement fork()?

+3

Entonces, lo que está diciendo es "Fork existe si se asegura de que lo haga utilizando la versión correcta de Windows e instalando un SDK que lo habilite". En mi humilde opinión, bien podría no existir. 'CreateProcess' es una opción mucho más fácil y mejor para el desarrollador de Windows (por supuesto, por supuesto). ¡Aclamaciones! –

+10

Sin Windows es una opción más fácil y mucho mejor. –

+7

Lamentablemente, parece que SUA está en desuso en Windows 8, y "se eliminará por completo de la próxima versión": http://brianreiter.org/2011/09/15/sua-deprecated-in-windows-8/ – RichieHindle

Cuestiones relacionadas