1

I want to create an async. server. i succeed to do that, but now i want to bind async_read/asyn_write functions to caller object function. So i tried to do that with boost::function here you have my code :

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 and .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();
}

and Network.cpp and .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)));
}

When i want to compile that, i have the following errors :

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

After so many hours of "googlings" and reflexion, i didn't found why i have these errors. Anyone can help me plz ?

Adrien A.
  • 441
  • 2
  • 12
  • 31

2 Answers2

2

Mmm.. Maybe you have left them out but you failed to include the headers:

Edit That seems to obvious. If it's not that then
Edit 2 Note that these suggestions have been typed when full information about the include structure wasn't given. The problems has been resolved now, but these hints are good general troubleshooting advice whenever strange issues arise with the compiler not 'seeing' your declarations:

  • check precompiled header settings (disable them, e.g.)
  • check you header include guards (if they are incorrect, e.g.

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

    in your Client.h...

  • check namespace issues

    • accidentally declared Network in a namespace
    • included Network.h from within a namespace { ... } block
  • check preprocessor issues (#defines wreaking havoc?)

Server.cpp

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

//....

Client.cpp

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

Network.cpp

include "Network.h"

And probably (form looking at the errors):

Client.h

include "Network.h"

too

sehe
  • 374,641
  • 47
  • 450
  • 633
  • added many more thought by now. By the way, since you deleted them, there is really _nothing_ left for us to see. As you can probably _tell_ the compiler doesn't know anything about those identifiers. That is pretty essential. – sehe Nov 16 '11 at 21:39
  • i added all of my includes on my topic – Adrien A. Nov 16 '11 at 21:45
1

In Network.h, do not include Client.h, but instead forward declare class Client.

Tyler Hyndman
  • 1,402
  • 3
  • 17
  • 24
  • yeah it's working, i deleted #include "Client.h" and added "class Client;". i have other errors but i will try to fix these alone. thanks – Adrien A. Nov 16 '11 at 21:51