【问题标题】:boost::asio server multi-processboost::asio 服务器多进程
【发布时间】:2011-03-01 13:51:36
【问题描述】:

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

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
}

是否可以通过 boost 做类似的事情?我真的不知道如何获得这两个不同的套接字,因为在 boost 中所有的函数(listenbindaccept 等)都返回 void。

【问题讨论】:

  • 为什么您觉得每个连接都需要一个进程?这样的设计根本无法扩展,而且确实不符合 Boost.Asio 提倡的异步设计模式的精神。
  • 完全可以。看看其中一个多线程示例,它通常会在哪里启动另一个线程,您应该能够改为 fork。
  • 这与boost::asio 有什么关系? AFAIK,发布的代码都是 POSIX!
  • @Matt,你好心告诉我你指的是哪个例子以及我必须在哪里放置 fork() 指令吗?谢谢... Andrè..发布的代码显然是POSIX ..我的问题的目标是在最后两行...那么如果可以使用Boost asio库获得与我通过代码获得的相同行为我已经发布了...

标签: c++ tcp boost-asio multiprocess


【解决方案1】:

是的,可以使用 Boost.Asio 为每个连接创建一个进程。有关将bindlistenaccept 映射到相关 Boost.Asio 类型的信息,请参阅 BSD Socket APIBoost.Asio 文档。

不过,正如我在评论中指出的那样,我觉得这种设计根本无法很好地扩展。您最好学习异步设计模式并使用 Boost.Asio 库的真正优势。如需更多信息,请参阅C10K problem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2013-09-20
    相关资源
    最近更新 更多