替代Windows中的分叉 [英] Substitute for forking in windows
本文介绍了替代Windows中的分叉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我一直在遵循 Beej联盟指南,并在服务器部分有代码的一部分,它调用了一个函数fork()。
pre $ if $(!fork()){ //这是子进程
close(sockfd); //发送(new_fd,Hello,world!,13,0)== -1)
perror(send);
close(new_fd);
exit(0);
我在一台Windows机器上,无法让这部分工作。我能做些什么来解决这个问题?
我的代码如下。
/ * Server * /
#define _WIN32_WINNT 0x501
#include< iostream>
#include< windows.h>
#include< winsock2.h>
#include< ws2tcpip.h>
#include< stdio.h>
#include< sys / types.h>
使用namespace std;
const int winsockVersion = 2;
#define BACKLOG 10
#define PORT3000
int main(void){
WSADATA wsadata; (WSAStartup(MAKEWORD(winsockVersion,0),& wsadata)== 0){
cout <<< - WSAStartup initialized ...<<< ENDL;
int状态;
int sockfd,new_fd;
const char yes ='1';
struct addrinfo提示,* 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; ((status = getaddrinfo(NULL,PORT,& hints,& res))== 0){
cout<< - 调用addrinfo以获得成功! << ENDL; $($ s
)
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<< - 无法创建套接字。 << ENDL;
继续;
} else {
cout<< - 创建的套接字。 << ENDL;
}
//清除使用的端口。
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,& yes,sizeof(int))== -1){
cout<< - 无法清除阻塞的端口。 << ENDL;
perror(setsockopt);
exit(1);
if(bind(sockfd,loop_find-> ai_addr,loop_find-> ai_addrlen)== -1){
closesocket(sockfd);
perror(server:bind);
继续;
}
break;
if(listen(sockfd,BACKLOG)!= -1){
cout <<< - 监听传入连接。
}
//接受循环。
while(true){
socklen_t addr_size = sizeof their_addr;
new_fd = accept(sockfd,(sockaddr *)& their_addr,& addr_size);
if(new_fd == -1){
perror(accept);
继续;
}
struct sockaddr new_addr;
int len = sizeof new_addr;
getpeername(new_fd,& new_addr,& len);
cout<< - 连接到<< new_addr.sa_data<< ENDL;
if(!fork()){//这是一个子进程
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不成功<< ENDL;
} else {
cout <<< - WSACleanup success<< ENDL;
}
return 0;
$ b
解决方案
fork )在Windows上显然不存在。相反,您需要创建新主题 ,或整个新流程。
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.
这篇关于替代Windows中的分叉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文