Увеличить asio ip tcp iostream Обнаружение ошибок - PullRequest
1 голос
/ 24 июня 2009

Привет. Я только начинаю работать с библиотекой boost :: asio и столкнулся с некоторыми ранними трудностями, связанными с boost :: asio :: ip :: tcp :: iostream.

Мой вопрос состоит из двух частей:

1.) Как подключить iostream, используя просто номер хоста и порта?

Я могу заставить примеры client и server [boost.org] нормально работать как закодированные. Сервер указывает порт явно:

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), 13);
tcp::acceptor acceptor(io_service, endpoint);

Порт 13 является хорошо известным портом для "дневной" службы.

Пример клиента подключается, указав хост и имя службы:

tcp::iostream s(argv[1], "daytime");

Для моего собственного приложения я хотел бы установить сервер на произвольный порт и подключиться по номеру, как показано ниже:

Сервер:

boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), port);
tcp::acceptor acceptor(io_service, endpoint);
acceptor.accept(*this->socketStream.rdbuf());
...

Клиент:

boost::asio::ip::tcp::iostream sockStream;
...
sockStream.connect("localhost", port);
...

Если в клиенте я пытаюсь указать номер порта напрямую (вместо службы по имени), поток не может подключиться. Есть ли способ сделать это? Мне не ясно, какие аргументы для подключения могут / должны быть.


2.) Какой предпочтительный способ проверить успешность вызова iostream :: connect?

Функция возвращает void, и исключение не выдается. Единственный метод, который я разработал, - это тестирование stream.fail () и / или stream.good (). Это способ сделать это, или есть какой-то другой метод.


Буду признателен за консультацию по одному или обоим из них. Кроме того, если я пропущу соответствующую документацию и / или примеры, это было бы неплохо. До сих пор я не смог ответить на эти вопросы, читая документы по библиотеке или выполняя поиск в сети.

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Я не знаю, почему asio не работает (по крайней мере, с Boost 1.35.0) с номером порта, выраженным как int. Но вы можете указать номер порта в виде строки. т.е.

tcp::iostream s(hostname, "13");

должно работать.

относительно обнаружения ошибок:

tcp::socket имеет метод connect (), который принимает конечную точку и ссылку на boost::system::error_code объект, который сообщит вам, успешно ли он подключился.

0 голосов
/ 07 мая 2013

Даже если ошибка не возвращается, stream.error () содержит последний код ошибки. Я использовал код

do
{
    m_stream.clear();
    m_stream.connect(host, port);
}
while(m_stream.error());`

Вы также можете проверить только конкретную ошибку boost :: asio :: error :: connection_refused.

...