повысить повторное использование сокета asio unix

Я хочу использовать в своей программе дизайн «каждый io_service для каждого рабочего потока». Но я не могу повторно использовать сокет unix:

io_service io_1;
io_service io_2;
::unlink("/tmp/test");
stream_protocol::endpoint ep("/tmp/test");
stream_protocol::acceptor acceptor_1(io_1, ep, true);
stream_protocol::acceptor acceptor_2(io_2, ep, true);
io_1.run();
io_2.run();

терпит неудачу с «адрес уже используется». Когда я открываю свой asio/basic_socket_acceptor.hpp (boost 1.46.1), я вижу описание конструктора акцептора:

Этот конструктор создает акцептор и автоматически открывает его для прослушивания новых подключений к указанной конечной точке.

@param reuse_addr указывает, должен ли конструктор устанавливать параметр сокета socket_base::reuse_address.

basic_socket_acceptor(boost::asio::io_service& io_service, 
    const endpoint_type& endpoint, bool reuse_addr = true)

Это ошибка boost asio, и я должен отправить ее в багтрекер, я прав?


person puchu    schedule 12.02.2012    source источник


Ответы (1)


Потому что вы должны использовать 1 акцептор в одном из потоков. Вместо этого вы создали два акцептора.

Таким образом, вам нужно запустить 1 акцептор и распределить разные сеансы подключения на разных io_service.

Примечание:

io_1.run();
io_2.run();

Ни один поток не запускает...

Перечитайте примеры и попытайтесь их понять.

person Artyom    schedule 12.02.2012
comment
Благодарность! действительно только один акцептор. Я нашел хороший пример http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/http/server2/server.cpp - person puchu; 12.02.2012
comment
это нормально, что мой пример не запускает ни одного потока: во втором конструкторе было выброшено исключение, и я решил не загромождать вопрос. Благодарность - person puchu; 12.02.2012