«Ошибка: был сделан запрос на подключение к уже подключенному сокету» - PullRequest
2 голосов
/ 27 октября 2011

Я пытаюсь написать программу, которая будет запрашивать определенную информацию, например внутреннюю температуру, с камеры, которая действует как сервер, извините, если моя терминология отключена, но в основном я имею в виду, что связь скамера достигается через HTTP получить запросы.По сути, программа просто вызывает слегка адаптированную версию async_client из библиотеки наддува, каждый раз проходя по другому пути, чтобы проверить другое значение, затем сравнивает возвращаемое значение, чтобы убедиться, что оно звучит разумно, прежде чем перейти по другому путипроверьте что-то еще.

Кажется, код работает правильно с первого раза, но со второй попытки он попадает в функцию handle_connect и выдает «Ошибка: был сделан запрос на подключение к уже подключенному сокету»

Вот как выглядит функция:

void Async_client::handle_connect(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator)
  {
        http_deadline_timer_.cancel();
        if (!err)
        {
            // The connection was successful. Send the request.
            boost::asio::async_write(socket_, request_, boost::bind(&Async_client::handle_write_request, this,
              boost::asio::placeholders::error));
            //deadline timer stuff
            http_deadline_timer_.expires_from_now( ::boost::posix_time::seconds(1));
            http_deadline_timer_.async_wait( ::boost::bind(&Async_client::call_handle_deadline_timeout, this, boost::asio::placeholders::error));
        }
        else if (endpoint_iterator != tcp::resolver::iterator())
        {
            // The connection failed. Try the next endpoint in the list.
            socket_.close();
            tcp::endpoint endpoint = *endpoint_iterator;
            socket_.async_connect(endpoint, boost::bind(&Async_client::handle_connect, this,
              boost::asio::placeholders::error, ++endpoint_iterator));
            //deadline timer stuff
            http_deadline_timer_.expires_from_now( ::boost::posix_time::seconds(1));
            http_deadline_timer_.async_wait( ::boost::bind(&Async_client::call_handle_deadline_timeout, this, boost::asio::placeholders::error));
        }
        else
        {
            LOG_WARN("Async_client.cpp: Error: " << err.message()); 
        }
  }

Я попытался скопировать этот раздел кода из оператора else if в оператор else, а также подумал, что он закроет сокет и перезапустится.функция handle_connect, но кажется, что она просто приводит к сбою программного обеспечения на конечной точке = * endpoint_iterator line.

socket_.close();
            tcp::endpoint endpoint = *endpoint_iterator;
            socket_.async_connect(endpoint, boost::bind(&Async_client::handle_connect, this,
              boost::asio::placeholders::error, ++endpoint_iterator));

Кто-нибудь знает, что мне делать в этой ситуации?Отключить розетку и снова подключить?Если да, то как мне это сделать?

1 Ответ

0 голосов
/ 27 октября 2011

Возможно использование опции SO_REUSEADDR с setsockopt может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...