2012-02-19 2 views
3

Я разрабатываю игру 3d (первый/третий человек), и я пытаюсь сделать ее многопользовательской, используя сокеты TCP. Для этого я использую библиотеку boost asio, и я немного над головой. Я немного поиграл с учебниками и примерами на странице повышения asio doc, и они скомпилировали/выполнили/отлично работали, я просто немного смущен относительно того, как все работает.Boost Asio - Сервер не получает сообщение

Сейчас я просто пытаюсь заставить сервер принимать сообщения от клиента и печатать сообщение после его получения. Когда я выполняю приведенный ниже код (он компилирует/ссылки/работает отлично), ничего не происходит. Более конкретно, клиент, похоже, успешно отправил сообщение, и сервер, похоже, не получил сообщение.

код клиента:

ClientFramework::ClientFramework() : 
    mResolver(mIOService) 
{ 
} 

bool ClientFramework::Initialize() 
{ 
    try 
    { 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator it = mResolver.resolve(query); 
     tcp::socket socket(mIOService); 
     boost::asio::connect(socket, it); 

     std::string s = "hello world"; 
     boost::system::error_code e; 
     socket.write_some(boost::asio::buffer(s.c_str(), s.size()), e); 

     if (e) 
     { 
      throw boost::system::system_error(e); 
     } 
    } catch (std::exception& e) 
    { 
     gLog << LOG_ERROR << e.what() << "\n"; 
    } 

    return true; 
} 

Серверный код:

ServerFramework::ServerFramework() : 
    mAcceptor(mIOService, tcp::endpoint(tcp::v4(), 13)) 
{ 
} 

bool ServerFramework::Initialize() 
{ 
    mIOService.run(); 
    StartAccept(); 

    return true; 
} 

void ServerFramework::StartAccept() 
{ 
    Connection::ptr conn = 
     Connection::create(mAcceptor.get_io_service()); 
    mAcceptor.async_accept(conn->Socket(), 
     boost::bind(&ServerFramework::HandleAccept, this, conn, 
      boost::asio::placeholders::error)); 
} 

void ServerFramework::HandleAccept(Connection::ptr conn, 
    const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
     conn->Initialize(); 
    } 

    StartAccept(); 
} 

Connection::ptr Connection::create(boost::asio::io_service& io_service) 
{ 
    return ptr(new Connection(io_service)); 
} 

tcp::socket& Connection::Socket() 
{ 
    return mSocket; 
} 

void Connection::Initialize() 
{ 
    boost::asio::async_read(mSocket, boost::asio::buffer(buf, BUFFER_SIZE), 
     boost::bind(&Connection::handle_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

Connection::Connection(boost::asio::io_service& io_service) : 
    mSocket(io_service) 
{ 
} 

void Connection::handle_read(const boost::system::error_code& e, size_t size) 
{ 
    std::string s(buf, size); 
    gLog << LOG_INFO << s << "\n"; 

    boost::asio::async_read(mSocket, boost::asio::buffer(buf, BUFFER_SIZE), 
     boost::bind(&Connection::handle_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

ответ

4

Это не выглядит, как ваш io_service имеет любую работу, чтобы сделать, когда вы вызываете run().

bool ServerFramework::Initialize() 
{ 
    mIOService.run(); // <-- you don't check the return value here 
    StartAccept(); 

    return true; 
} 

он вернет number of handlers executed, я подозреваю, что он равен нулю. Попробуйте ссылающегося на него после того, как async_accept()

bool ServerFramework::Initialize() 
{ 
    StartAccept(); 
    mIOService.run(); 

    return true; 
} 

Хотя, это не совсем очевидно, ваши ограниченные фрагменты кода, где вы вызываете ServerFramework::Initialize(). Я предлагаю отредактировать ваш вопрос с помощью short, self contained, correct example, который мы можем скомпилировать с минимальными усилиями. Ваш текущий код не будет компилироваться без дополнительных шаблонов, например main().