2014-03-19 1 views
1

tcp 연결을 시작하는 간단한 boost :: asio 프로그램을 구현했습니다. 리눅스 (우분투 12.04, 부스트 1_48, gcc 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(); 
} 

EDIT : 해결

문제점 여기

참조하기위한 코드이다. 그것은 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. 
} 
관련 문제