2012-02-23 2 views
2

Я новичок в библиотеках Boost Asio, мое требование - создать сервер, который будет асинхронно слушать на 600 различных портах (TCP-связь). Может ли кто-нибудь предложить мне разумный способ достичь этого, используя Boost Asio. Я попытался использовать пример эхо-сервера, представленный в документации Boost Asio, но не мог понять много. boost :: asio :: io_service io_service;Открытие нескольких портов с использованием библиотек Boost Asio

using namespace std; // For atoi. 
for(long port=50000;port<=50600;port++) 
{ 
    server s(io_service, port); 
    io_service.run(); 
} 

Может кто-нибудь пролить свет на это?

+1

«Мое требование заключается в создании сервера, который должен прослушивать 600 различных портов» - вы уверены, что это то, что вы хотите сделать? –

+0

Да, Мартин, что-то делать с имитационными устройствами, и у меня есть 600 симуляторов, поэтому мне нужно отдельное подключение для каждого устройства. – SKR

+0

@ user1229153 Вы можете принимать столько соединений, сколько хотите, с одним сервером на одном порту. – spencercw

ответ

5

io_service является ответственный за обработку всех входов/выходов, которые ему назначены; вам не нужно создавать отдельный для каждого порта. Для того, что вы пытаетесь сделать, вам нужно будет создать 600 отдельных экземпляров сервера, затем вызовите io_service.run().

vector<shared_ptr<server> > servers; 
for (uint16_t port = 50000; port != 50600; ++port) 
{ 
    servers.push_back(shared_ptr<server>(new server(io_service, port))); 
} 
io_service.run(); 
+0

Спасибо. Я попробую это. – SKR

+0

Спасибо, Spencercw, у меня есть еще один вопрос: как распечатать полученные данные в двоичном формате? Я получаю его в один буфер символов, и, следовательно, _itoa терпит неудачу. – SKR

+0

@ user1229153 Это легко сделать с iostreams. Извините за плохое форматирование; Я не могу делать многострочные комментарии. 'unsigned char buf [] = {'\ xab', '\ xcd', '\ xef'}; cout << hex << setfill ('0'); для (size_t i = 0; i! = Sizeof (buf); ++ i) { cout << setw (2) << static_cast (buf [i]); } cout << "\ n"; ' Это напечатает' abcdef'. – spencercw

0

попробовать что-то вдоль линий этого

boost::asio::ip::tcp::socket socket(io_service); 

socket.async_connect(endpoint, connectHandler); 

socket The переменного является экземпляром одного сокета, и вызов async_connect настраивает асинхронное подключение к местоположению определенного endpoint. Вы можете выполнять асинхронные операции чтения и запись socket подобным образом, просто убедитесь, что io_service.run() работает в потоке где-то, или асинхронные вызовы (и связанные с ними обратные вызовы) не будут выполнены ...

+0

Спасибо за ответ, извините, я не понял полностью, вы хотите, чтобы я добавил это в класс сервера? – SKR

+0

Да, хотя в ретроспективе вам может понадобиться создать экземпляр прослушивателя вместо попытки «async_connect», поскольку это сервер, а не клиент. Предполагая, что у вас уже есть слушатель, созданный в вашем объекте 'server', решение @spencercw, вероятно, ближе к тому, что вам нужно. – hatboyzero

+0

Поблагодарите s hatboyzero, я попробую, что предложил spencercw. – SKR

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