c++ - substitute for fork()ing? in windows - Stack Overflow


I've been following Beej Networking guide and in the server section there is portion of code where it has called a function fork().


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);

I'm on a windows machine and cant get that part working. What can I do to solve this?. My code is as follows.


/* 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; }



fork() obviously doesn't exist on Windows. Instead you'll need to create a new thread, or a whole new process.




Contrary to both existing answers (from OJ and Vincent Robert) fork() does exist on high-end versions of Windows. It's part of Subsystem for UNIX-based Applications (SUA) earlier called Microsoft Windows Services for UNIX (SFU), earlier called Interix.


Citing http://en.wikipedia.org/wiki/Interix, SUA is available on



  • Windows Server 2003 R2 (all editions) - version 5.2

  • Windows Vista (Ultimate and Enterprise editions) - version 6.0

  • Windows Server 2008 (all editions) - version 6.0

  • Windows Server 2008 R2 and Microsoft Windows 7 - version 6.1


All you have to do to use fork() is to install free SUA SDK. Depending on your target system you need one of the following:



You can also take a look at Does Interix implement fork()?




fork does not exist on Windows. You have to use a Window specific API called CreateProcess.


Contrary to fork, CreateProcess needs the path to the EXE. You can retrieve the path of the current EXE by calling GetModuleFileName with a NULL parameter.



I've been following Beej Networking guide and in the server section there is portion of code where it has called a function fork().


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);

I'm on a windows machine and cant get that part working. What can I do to solve this?. My code is as follows.


/* 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; }


fork() obviously doesn't exist on Windows. Instead you'll need to create a new thread, or a whole new process.



Contrary to both existing answers (from OJ and Vincent Robert) fork() does exist on high-end versions of Windows. It's part of Subsystem for UNIX-based Applications (SUA) earlier called Microsoft Windows Services for UNIX (SFU), earlier called Interix.


Citing http://en.wikipedia.org/wiki/Interix, SUA is available on



  • Windows Server 2003 R2 (all editions) - version 5.2

  • Windows Vista (Ultimate and Enterprise editions) - version 6.0

  • Windows Server 2008 (all editions) - version 6.0

  • Windows Server 2008 R2 and Microsoft Windows 7 - version 6.1


All you have to do to use fork() is to install free SUA SDK. Depending on your target system you need one of the following:



You can also take a look at Does Interix implement fork()?



fork does not exist on Windows. You have to use a Window specific API called CreateProcess.


Contrary to fork, CreateProcess needs the path to the EXE. You can retrieve the path of the current EXE by calling GetModuleFileName with a NULL parameter.