2017-09-29 7 views
2

Les gars J'ai vraiment besoin de votre aide. J'apprends boost::asio et j'ai 2 problèmes que je ne peux pas traiter pendant des jours ...boost :: serveur asio avec des fonctions simples

Voici un exemple d'un serveur simple écho fait par moi-même:

int main(
{ 
    // crate a server, binding it and listening connections 

    // acceptor server; 

    //socket client 

    server.async_accept(client, boost::bind(accept_handle, _1, &server, &client)); 

    io_service.run(); 

    return 0; 
} 

void accept_handle(const boost::system::error_code& eCode, boost::asio::ip::tcp::acceptor* server, boost::asio::ip::tcp::socket* client) 
{ 
    char data[43]; 
    client->async_read_some(boost::asio::buffer(data, 20), boost::bind(read_handle, _1, _2, server, client)); 
} 

void read_handle(const boost::system::error_code& eCode, size_t bytes) 
{ 
    char data_buf[20] = "hello"; 
    client->async_write_some(boost::buufer(data, 5), boost::bind(write_handle, _1, _2, server, client)); 
} 

void write_accept(const boost::system::error_code& eCode, size_t bytes) 
{ 
    boost::asio::ip::tcp::socket newConnection(server->get_ioservice)); // taking he io_service of the server 

    server->async_accept(newConnection, boost::bind(accept_handle, _1, server, client)); 
} 

Le problème est le serveur accepter un client et n'accepte pas d'autre client en attente .. où est-ce que je fais mal ici

NOTE: J'ai écrit ce code dans le bloc-notes donc désolé pour les erreurs de syntaxe s'il y en a.

Merci pour votre aide à l'avance !!!

+0

Vous devez l'appeler à nouveau dans votre fonction 'accept_handle'. –

+1

Copie possible de [Comment créer un serveur boost capable de gérer plusieurs clients en même temps?] (Https://stackoverflow.com/questions/31579362/how-do-i-create-a-boost-server-that- can-handle-multiple-clients-at-once) –

+0

Richard Hodges vous voulez dire que j'ai besoin d'appeler mon accept_handle pour accepter une autre connexion au moment où le serveur lit un client mais pourquoi est-il faux d'appeler async_handle from write_handle ??? –

Répondre

0

Le code ne peut accepter qu'une seule connexion car il est et non en appelant async_accept dans la fonction accept_handle.

Le code peut également avoir un problème avec les durées de vie des objets: il serait judicieux d'utiliser des pointeurs partagés pour gérer le clients voir: Boost async_* functions and shared_ptr's. Async_accept acceptera une connexion.

+0

@Gruffalo, merci d'éditer ma réponse changer '' write_accept' à async_accept '. Cependant, le code de @ Abor a une fonction appelée 'write_accept' qui crée un' newConnection', puis appelle 'async_accept' ... – kenba

+0

oups, désolé :) ... –