Substitute for forking in windows(替代在 Windows 中分叉)
问题描述
我一直在关注 Beej Networking guide 并在服务器部分有一部分代码在其中调用了函数 fork().
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);
我在 Windows 机器上,无法让那部分工作.我能做些什么来解决这个问题?我的代码如下.
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() 在 Windows 上显然不存在.相反,您需要创建一个新线程,或全新流程.
fork() obviously doesn't exist on Windows. Instead you'll need to create a new thread, or a whole new process.
这篇关于替代在 Windows 中分叉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:替代在 Windows 中分叉
基础教程推荐
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- CString 到 char* 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
