Arhn - архитектура программирования

boost::asio::acceptor зависает на win7

Я реализовал простую программу boost::asio, которая запускает tcp-соединение. Он отлично работает на Linux (ubuntu 12.04, boost 1_48, gcc 4.6.4), но не на Win7 (boost 1_55, vs2008express).

Приняв несколько (от 3 до 20) соединений, он зависает и больше не принимает соединения. Это какая-то проблема с защитой Windows? Выключаю брандмауэр и антивирус.

Вот код для справки:

#include <iostream>

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

class Session : public boost::enable_shared_from_this<Session>
{
  public:
    Session(boost::asio::io_service &io_) : tcpSocket(io_)
    {
      std::cerr << "session ctor" << std::endl;
    }
    ~Session()
        {
      std::cerr << "session Dtor" << std::endl;
    }
    boost::asio::ip::tcp::socket& getTcpSocket() { return this->tcpSocket; }

private:
    boost::asio::ip::tcp::socket tcpSocket;
};

class Server
{
public:

    static const unsigned int defaultPort = 55550;
    Server();
    void start();

private:

    boost::asio::io_service io;
    boost::asio::ip::tcp::acceptor acceptor;

    void startAccept();
    void handleAccept(boost::shared_ptr<Session> s_,
          const boost::system::error_code& e_);
};

Server::Server()
    : acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), defaultPort))
{
}

void Server::start()
{
    this->startAccept();
    this->io.run();
}

void Server::startAccept()
{
    boost::shared_ptr<Session> s(new Session(io));

    acceptor.async_accept(s->getTcpSocket(), boost::bind(&Server::handleAccept,
                           this, s, boost::asio::placeholders::error));
}

void Server::handleAccept(boost::shared_ptr<Session> s_,
      const boost::system::error_code& e_)
{
    std::cerr << "handleAccept" << std::endl;

    if(e_)
        std::cerr << e_ << std::endl;

    this->startAccept();
}

int main(int, char**)
{
  Server server;
  server.start();
}

РЕДАКТИРОВАТЬ:

Проблема решена. Это была проблема Cygwin.

19.03.2014

Ответы:


1

Возможно, приемнику Win7 требуется возможность повторного использования адреса: например, SO_REUSEADDR.
Попробуйте изменить конструктор сервера на:

Server::Server()
: acceptor(io)
{
  boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), defaultPort);
  acceptor.open(endpoint.protocol());
  acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  boost::system::error_code ec;
  acceptor.bind(endpoint, ec);

  if(ec)
    // raise an exception or log this error, etc.
}
19.03.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..