2011-03-01 3 views
2

Я бы сделал простой многопроцессорный (не потоковый) сервер. Я видел итеративный пример, в котором он обрабатывает один запрос за раз. Вместо этого мне нужно обрабатывать больше запросов (больше на менее 10) одновременно. В классическом С и С ++ примеров, я видел, что сервер разработан так:boost :: asio server multi-process

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 все функции (listen, bind, accept и т. Д.) Return void.

+0

Почему вы чувствуете, что вам нужен процесс за соединение? Такой дизайн просто не масштабируется и действительно не в духе асинхронных шаблонов дизайна, продвигаемых Boost.Asio. –

+1

Совершенно уверен, что вы можете. Посмотрите на один из многопоточных примеров и где он обычно запускает другой поток, вы должны иметь возможность использовать fork. – Matt

+0

Какая часть этого связана с 'boost :: asio'? AFAIK, опубликованный код - все POSIX! –

ответ

0

Да, можно использовать Boost.Asio для разметки процесса для каждого соединения. См. Документацию Boost.Asio для сопоставлений bind, listen, accept в соответствующие типы Boost.Asio.

Хотя, как я отметил в своем комментарии, я не чувствую, что этот дизайн хорошо масштабируется. Вам лучше изучить асинхронные шаблоны проектирования и использовать реальные преимущества библиотеки Boost.Asio. Для получения дополнительной информации см. C10K problem.

 Смежные вопросы

  • Нет связанных вопросов^_^