2011-03-01 108 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