c++ - boost::asio::acceptor 在 win7 上挂起

标签 c++ cygwin boost-asio

我已经实现了启动 tcp 连接的简单 boost::asio 程序。 它在 linux 上运行完美(ubuntu 12.04,boost 1_48,gcc 4.6.4), 但不是在 Win7 上(boost 1_55,vs2008express)。

在接受了几个(从 3 到 20 个)连接后它挂断了,并且不再接受连接。 是 window 保护问题吗?我关闭防火墙和杀毒软件。

引用代码如下:

#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 的问题。

最佳答案

可能是 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.
}

关于c++ - boost::asio::acceptor 在 win7 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22505541/

相关文章:

cygwin - 将 cygwin bash 转换为 tcsh

linux - 使用 date 命令打印上个月的最后一天

c++ - 如何使用 <windows.h> C++ 获取当前目录名称

c++ - 使用 Visual Studio 2017 在 Linux 上构建现有的 C++ 解决方案

c++ - 为什么 glGetProgramInfoLog 返回一个空字符串?

c++ - 如何定义一个可以结构化绑定(bind)的对象的概念?

python - 使用 Python boto 连接到 AWS 超时

c++ - 在 boost::asio 中使用具有可调整大小的 streambuf 的相同 istream

Boost asio架构文档

c++ - 使用 Asio (Boost) 通过网络发送灵活数量的数据