2011-11-16 3 views
1

Je veux créer un asynchrone. serveur. Je réussis à le faire, mais maintenant je veux lier les fonctions async_read/asyn_write à la fonction d'objet appelant. Donc, j'ai essayé de le faire avec la fonction boost :: ici vous avez mon code:erreur de compilation asio async avec les fonctions asynchrones

Server.cpp

#include "Server.h" 
#include "Client.h" 
#include "Network.h" 

void  Server::accept(void) 
{ 
    Network::ptr connection = Network::create(this->my_acceptor.get_io_service()); 
    this->my_acceptor.async_accept(connection->getSocket(), bind(&Server::endCmd, this, connection, placeholders::error)); 
} 

void  Server::endCmd(Network::ptr connection, const boost::system::error_code& error) 
{ 
    if (!error) 
     { 
      std::cout << "Recu un client!" << std::endl; 
      this->client.push_back(new Client(connection)); 
      this->client[client.size() - 1]->checkAuthentification(); 
      std::cout << "Envoie du message de securisation" << std::endl; 
      std::cout << "Nouvelle ecoute" << std::endl; 
      this->accept(); 
     } 
} 

Client.h et Cpp

#include "Network.h" 

class Client 
{ 
private: 
    Network::ptr connection; 

public: 
    Client(Network::ptr); 
    ~Client(); 
    void   checkAuthentification(void); 
    void   endRead(const error_code& error, size_t nbytes); 
    void   endWrite(const error_code &error); 
}; 

#include "Client.h" 

Client::Client(Network::ptr connect) 
{ 
    this->connection = connect; 
    this->connection->assignFunction(this); 
} 

Client::~Client() 
{ 
    this->connection->close(); 
} 

void   Client::checkAuthentification(void) 
{ 
    this->connection->Swrite("BIENVENUE", this); 
} 

void   Client::endRead(const error_code& error, size_t nbytes) 
{ 
    if (!error && nbytes != 0) 
     { 
      std::cout << this->connection->getRcvMsg() << std::endl; 
      this->connection->Sread(this); 
     } 
    else 
     this->connection->close(); 
} 

void   Client::endWrite(const error_code &error) 
{ 
    if (!error) 
     this->connection->Sread(this); 
    else 
     this->connection->close(); 
} 

et Network.cpp et .h

#include "Client.h" 

class  Network : public boost::enable_shared_from_this<Network> 
{ 
private: 
    tcp::socket    socket; 
    std::string    rcv_msg; 
    std::string    msg; 
    boost::array<char, 6> rbuffer; 
    boost::function<void (Client *, const error_code &, size_t)> fread; 
    boost::function<void (Client *, const error_code &)> fwrite; 

public: 
    typedef boost::shared_ptr<Network> ptr; 

    Network(io_service &); 
    ~Network(); 
    void    assignFunction(void); 
    void    close(void); 
    void    Sread(Client *cli); 
    void    Swrite(std::string msg, Client *cli); 
    tcp::socket&  getSocket(void); 
    std::string   getRcvMsg(void); 
    static ptr   create(io_service &); 
}; 

#include "Client.h" 
#include "Network.h" 

Network::Network(io_service &ios) : socket(ios) 
{ 
} 

Network::~Network() 
{ 
    this->close(); 
} 

void   Network::assignFunction(void) 
{ 
    this->fread = &Client::endRead; 
    this->fwrite = &Client::endWrite; 
} 

void   Network::close(void) 
{ 
    if (this->socket.is_open()) 
    { 
     std::cout << "Connection closed" << std::endl; 
     this->socket.close(); 
    } 
} 

void  Network::Sread(Client *cli) 
{ 
    async_read(this->socket, buffer(this->rbuffer), bind(&Network::fread, cli, placeholders::error, placeholders::bytes_transferred)); 
} 


void   Network::Swrite(std::string msg, Client *cli) 
{ 
    this->msg = msg; 
    async_write(this->socket, buffer(this->msg, (int)this->msg.size()), bind(&Network::fwrite, cli, placeholders::error)); 
} 

std::string  Network::getRcvMsg(void) 
{ 
    return (std::string(this->rbuffer.c_array(), this->rbuffer.size())); 
} 

tcp::socket& Network::getSocket(void) 
{ 
    return (this->socket); 
} 

Network::ptr    Network::create(io_service &ios) 
{ 
    return (ptr(new Network(ios))); 
} 

Quand je veux compiler, j'ai les erreurs suivantes:

Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(6): error C2511: 'Client::Client(Network::ptr)' : overloaded member function not found in 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(13): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(13): error C2227: left of '->close' must point to class/struct/union/generic type 
    1>Client.cpp(18): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(18): error C2227: left of '->Swrite' must point to class/struct/union/generic type 
    1>Client.cpp(25): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(25): error C2227: left of '->getRcvMsg' must point to class/struct/union/generic type 
    1>Client.cpp(26): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(26): error C2227: left of '->Sread' must point to class/struct/union/generic type 
    1>Client.cpp(29): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(29): error C2227: left of '->close' must point to class/struct/union/generic type 
    1>Client.cpp(35): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(35): error C2227: left of '->Sread' must point to class/struct/union/generic type 
    1>Client.cpp(37): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(37): error C2227: left of '->close' must point to class/struct/union/generic type 
     Commande.cpp 
     main.cpp 
    Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
     My_exception.cpp 
     Network.cpp 
    Network.h(14): error C2065: 'Client' : undeclared identifier 
    Network.h(14): error C2059: syntax error : ',' 
    Network.h(15): error C2065: 'Client' : undeclared identifier 
    Network.h(15): error C2059: syntax error : ',' 
    Network.h(25): error C2065: 'Client' : undeclared identifier 
    Network.h(25): error C2065: 'cli' : undeclared identifier 
    Network.h(25): error C2143: syntax error : missing ',' before ')' 
    Network.h(29): error C2143: syntax error : missing ';' before '}' 
    Client.h(8): error C2143: syntax error : missing ';' before '{' 
    Client.h(18): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(6): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(7): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(10): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(12): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(15): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(16): error C2653: 'Client' : is not a class or namespace name 
    1>Network.cpp(17): error C2653: 'Client' : is not a class or namespace name 
    1>Network.cpp(18): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(21): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(23): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(26): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(27): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(30): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(31): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(31): error C2227: left of '->rbuffer' must point to class/struct/union/generic type 
    1>Network.cpp(31): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(31): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(32): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(35): error C2065: 'Client' : undeclared identifier 
    1>Network.cpp(35): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(35): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(36): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(38): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(38): error C2227: left of '->msg' must point to class/struct/union/generic type 
    1>Network.cpp(38): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(38): error C2227: left of '->msg' must point to class/struct/union/generic type 
    1>Network.cpp(38): error C2228: left of '.size' must have class/struct/union 
    1>Network.cpp(38): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(38): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(39): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(42): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(43): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(43): error C2227: left of '->rbuffer' must point to class/struct/union/generic type 
    1>Network.cpp(43): error C2228: left of '.size' must have class/struct/union 
    1>Network.cpp(43): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(44): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(47): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(49): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(52): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(54): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(55): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(55): fatal error C1004: unexpected end-of-file found 
     Server.cpp 
    Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
    1>Server.cpp(22): error C2664: 'Client::Client(const Client &)' : cannot convert parameter 1 from 'Network::ptr' to 'const Client &' 
       Reason: cannot convert from 'Network::ptr' to 'const Client' 
       No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

Après tant d'heures de "googlings" et de réflexion, je n'ai pas trouvé pourquoi j'ai ces erreurs. Tout le monde peut m'aider plz?

Répondre

1

En Network.h, ne comprennent pas Client.h, mais à la place forward declareclass Client.

+0

ouais cela fonctionne, j'ai supprimé #include "Client.h" et ajouté "class Client;". J'ai d'autres erreurs, mais je vais essayer de résoudre ces seuls. merci –

+0

Pas de problème, content de pouvoir aider. –

2

Mmm .. Peut-être que vous les avez laissés, mais vous pas inclure les en-têtes:

Modifier Cela semble évident. Si ce n'est pas le cas
Editer 2 Notez que ces suggestions ont été tapées lorsque des informations complètes sur la structure include n'ont pas été fournies. Les problèmes ont été résolus maintenant, mais ces conseils sont bons conseils de dépannage général chaque fois que des problèmes étranges surgissent avec le compilateur ne « voir » vos déclarations:

  • contrôle précompilés paramètres d'en-tête (les désactiver, par exemple)
  • contrôle vous-tête pour les inclusions (si elles sont incorrectes, par exemple

    #ifndef __NETWORK_H 
    #define __NETWORK_H 
    
    ... 
    #endif // __NETWORK_H 
    

    dans votre Client.h ...

  • vérifier que les problèmes namespace

    • accidentellement déclaré réseau dans un espace de noms
    • inclus Network.h à partir d'un namespace { ... } bloc
  • vérifier les questions de préprocesseur (#define s de ravages semant?)

Server. cpp

include "Network.h" 
include "Server.h" 

//.... 

Client.cpp

include "Network.h" 
include "Server.h" 

réseau.cpp

include "Network.h" 

Et probablement (forme regardant les erreurs):

Client.h

include "Network.h" 

trop

+0

non non, je l'ai supprimé pour montrer mon code –

+0

ajouté beaucoup plus de pensée maintenant. En passant, puisque vous les avez supprimés, il n'y a vraiment plus rien à voir. Comme vous pouvez probablement _tell_ le compilateur ne sait rien de ces identifiants. C'est assez essentiel. – sehe

+0

j'ai ajouté tout de mes inclut sur mon sujet –

Questions connexes