Хобрук: Ваш путь к мастерству в программировании

как отличить занятую конечную точку от не подключенной с помощью boost asio

У меня есть сокет TCP, который я хочу привязать к локальной конечной точке.

У меня есть 2 сценария:

  1. Подключение сокета к локальной конечной точке, которая не используется и не ожидает подключения.
  2. Подключение сокета к локальной конечной точке, которая использовалась/не была должным образом закрыта при предыдущем запуске.

Раньше я инициализировал акцептор, используя его конструктор, передавая ему io_service и конечную точку, но когда он пытался подключиться к используемой конечной точке, акцептор давал сбой.

acceptor_(io_service_, endpoint)

Следующее, что я сделал, это изменил конструктор, чтобы получить только io_service (который обещает, что сокет не будет открыт).

acceptor_(io_service_)

Я видел, что в asio есть функция bind(), которая связывает сокет с локальной конечной точкой. Функция bind() имеет параметр, указывающий, произошла ли ошибка, но для обоих описанных выше сценариев она возвращает одну и ту же ошибку.

boost::system::error_code ec;
acceptor_.bind(endpoint, ec);

if(ec)
{
    // SOME ERROR NOTIFYING
// EDIT: error code returned is 10009
}

Есть ли способ подключиться к конечной точке и получить разные ошибки для этих типов ошибок?

18.07.2012

  • Не могли бы вы сказать, что такое возвращенная ошибка? Что касается сбоя, вы пытались запустить его в отладчике, чтобы поймать сбой? 18.07.2012
  • Я добавил это в код. ошибка 10009. 18.07.2012
  • насчет краша - отладчик поймал. но акцептор инициализируется в списке инициализаторов конструктора класса. 18.07.2012
  • Если вы посмотрите справочное руководство page вы увидите, что 10009 равно WSAEBADF (дескриптор файла недействителен). Это означает, что вы не создали сокет должным образом. 18.07.2012

Ответы:


1

Сокет для акцептора, который я использовал, действительно недействителен.

согласно коду boost (находится по адресу: реализация boost asio ), я видел, что конструктор, который получает и io_service, и эндпоинт, открывает сокет по протоколу от самого эндпоинта, и только потом связывает его с акцептором.

решение состоит в том, чтобы инициализировать акцептор только с помощью io_service, затем открыть акцептор и привязать к нему конечную точку.

спасибо за комментарии!

18.07.2012
Новые материалы

Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

«Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
«Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

От теории к практике: пошаговое руководство по реализации наивного Байеса
Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь..

#093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

numberToString.js (8kyu 16)
Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

Лучшие практики для быстрого изучения языка программирования
Изучение языка программирования может быть сложной задачей, но при правильном подходе определенно возможно быстро выучить язык программирования. Хорошее понимание языка программирования может..