2011-03-01 63 views
2

我想做一个简单的多进程(不是线程)服务器。我已经看到了它一次处理一个请求的迭代示例。 相反,我需要在同一时间处理更多请求(多于少于10个)。 在经典的C和C++的例子,我已经看到了服务器的设计类似如下:boost :: asio服务器多进程

int listensd, connsd; // listening socket and conection socket 
pid_t pid;   //process id 
listensd=socket(....); 
bind(listensd,...); 
listen(listensd,...); 
for(;;) 
{ 

    connsd=accept(listensd,...); 
    if((pid=fork())==0) //child process 
    { 
     close(listensd); //close the listen socket 
     do_it(connsd); //serve the request 
     close(connsd); //close the connection socket 
     exit(0); 
    } 
close(connsd);  //the parent closes the connection socket 
} 

是否有可能做这样的事情与提升?我真的不知道如何获取这两个不同的socket,因为在boost中所有的函数(listenbindaccept等)都返回void。

+0

为什么你觉得你需要每个连接的进程?这样的设计根本无法扩展,实际上并不符合由Boost.Asio推广的异步设计模式的精神。 – 2011-03-01 15:12:28

+1

非常确定你可以。看看其中一个多线程示例,以及它通常会启动另一个线程的位置,您应该可以改为fork。 – Matt 2011-03-01 15:23:56

+0

这与boost :: asio有什么关系? AFAIK,发布的代码都是POSIX! – 2011-03-01 19:01:50

回答

0

是的,可以使用Boost.Asio为每个连接分叉一个进程。有关bind,listen,accept映射的相关Boost.Asio类型,请参阅BSD Socket API Boost.Asio文档。

虽然,正如我在我的评论中指出的那样,但我觉得这种设计根本没有规模。您最好学习异步设计模式并使用Boost.Asio库的实际优势。欲了解更多信息,请参阅C10K problem