2014-03-19 54 views
1

我已经实现了简单的boost :: asio程序来启动tcp连接。 它工作完美的Linux(Ubuntu的12.04,升压1_48,海湾合作委员会4.6.4), 但不是在Win7(升压1_55,vs2008express)。boost :: asio :: acceptor在win7挂断

接受几个(从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的问题。

回答

0

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