Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 5991217
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 22, 20262026-05-22T23:21:19+00:00 2026-05-22T23:21:19+00:00

I made a static-lib. And I created this three classes in Connection Class #ifndef

  • 0

I made a static-lib. And I created this three classes in

Connection Class

#ifndef _CONNECTION_H_
#define _CONNECTION_H_

#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include <memory>
#include "ByteBuffer.h"

class Connection: public boost::enable_shared_from_this<Connection>
{
public:
  typedef boost::shared_ptr<Connection> pointer;

  explicit Connection(boost::asio::io_service& io_service);
  virtual ~Connection();
  boost::asio::ip::tcp::socket& socket();

  virtual void OnConnected()=0;
  virtual void Send(std::shared_ptr<uint8_t> buffer, int length);
  void Receive();
  void Disconnect();
  bool connected;
protected:
  virtual void OnReceived(ByteBuffer &b) = 0;

private:
  void handle_Receive(const boost::system::error_code& error, std::size_t bytes_transferred );
  void handle_Send(const boost::system::error_code& error, std::size_t bytes_transferred);

  boost::asio::ip::tcp::socket socket_;
  bool disconnecting;
  boost::array<uint8_t, 1000> read_buffer_;
};

#endif


#include "Connection.h"


Connection::Connection(boost::asio::io_service& io_service)
    :socket_(io_service),disconnecting(false),connected(false){}

Connection::~Connection(){}


boost::asio::ip::tcp::socket& Connection::socket(){
    return socket_;
}

void Connection::Send(std::shared_ptr<uint8_t> buf, int length){
    boost::asio::async_write(socket_,boost::asio::buffer(buf.get(),length),
            boost::bind(&Connection::handle_Send, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void Connection::handle_Send(const boost::system::error_code& error, std::size_t bytes_transferred){

}

void Connection::Receive(){
     boost::asio::async_read(socket_,boost::asio::buffer(this->read_buffer_),
        boost::bind(&Connection::handle_Receive, shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
}

void Connection::handle_Receive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
  if(!error)
  {
      if(bytes_transferred <=0){
            this->Disconnect();
      }else{

ByteBuffer b((std::shared_ptr)this->read_buffer_.data(), this->read_buffer_.size());
this->OnReceived(b);
this->Receive();}
}
}

void Connection::Disconnect()
{
    if (!disconnecting) {
        boost::system::error_code ec;
        socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_send,ec);
        socket_.close(ec);
        disconnecting = true;
        std::cout<<"disconnected"<<std::endl;
    }
}

ConnectionFactory class

#pragma once
#include "Connection.h"
class ConnectionFactory
{
public:
    ConnectionFactory(void);
    virtual ~ConnectionFactory(void);

    virtual Connection::pointer create(boost::asio::io_service& io_service) = 0;
};


#include "ConnectionFactory.h"


ConnectionFactory::ConnectionFactory(void)
{
}


ConnectionFactory::~ConnectionFactory(void)
{
}

Server Class

#ifndef _SERVER_H_
#define _SERVER_H_

#include "Connection.h"
#include "ConnectionFactory.h"

class Server
{
public:
  Server(boost::asio::io_service& io_service , std::string ip,short port,boost::shared_ptr<ConnectionFactory> factory);
  ~Server();    
private:
  void start_accept();
  void handle_accept(boost::shared_ptr<Connection> conn,const boost::system::error_code& error);

  boost::shared_ptr<ConnectionFactory> m_factory;
  boost::asio::io_service &io_service;
  boost::asio::ip::tcp::acceptor acceptor_;
};

#endif

#include "Server.h"


Server::Server(boost::asio::io_service& io_service,std::string ip,short port,boost::shared_ptr<ConnectionFactory> factory)
    :io_service(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(ip.data()), port)){

        m_factory = factory;
        start_accept();

        std::cout<<"Socket accepting connections..."<<std::endl;
}

Server::~Server()
{
}


void Server::start_accept(){

    boost::shared_ptr<Connection> conn = m_factory->create(this->io_service);
    acceptor_.async_accept(conn->socket(),
        boost::bind(&Server::handle_accept, this,conn,boost::asio::placeholders::error));

}


void Server::handle_accept(boost::shared_ptr<Connection> conn,const boost::system::error_code& error){
    if (!error){
        std::cout<<"on connected"<<std::endl;
        conn->OnConnected();
        conn->Receive();
        start_accept();
    }
    //conn->Disconnect();
}

and I drevid from the static-lib and used this classes and it’s working perfect

in my main.cpp

#include <iostream>
#include "auth_proto.h"
#include <Server.h>
#include <ConnectionFactory.h>
#include "AuthConnectionFactory.h"

using namespace std;
int main()
{
    Auth_Setup();
  try
  {
      boost::asio::io_service io_service;
      boost::shared_ptr<ConnectionFactory> fact (new AuthConnectionFactory(io_service));
      Server s(io_service,"5.113.195.156",9959,fact);
      io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

I really don’t understand what is wrong here , when it comes to the Receive() function it’s receive the data from the client but it does not invoking the handle_Receive() method so I can use this data, the behavior that am waiting that it should call the handle_Receive() so I can pass the data to ByteBuffer and use it but that’s not happening ……

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-22T23:21:20+00:00Added an answer on May 22, 2026 at 11:21 pm

    boost::asio::async_read seems to call the read handler only when it reaches the "amount of data" passed to it.

    Quoting boost’s 1.46.0 reference:

    async_read

    Start an asynchronous operation to read a certain amount of data from a stream.

    So as a solution, use socket_.async_read_some instead of boost::asio::async_read if you wish to be informed of any arbitrary amount of data received.

    Another solution, as Sam Miller was trying to say in the comments, you can add a fixed size header containing the number of bytes incoming before each frame you’re supposed to receive, read the header then call boost::asio::async_read with the previously extracted number.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I've made a helper public static class UrlHelperExtension { public static string GetContent(this UrlHelper
Always was interested why are Array.Sort() and Array.IndexOf() methods made static and similar ArrayList.Sort()
I've made the following extension method ... public static class ObjectExtensions { public static
After I made a public static class has some public static variables when I
For collection of smaller helper utility classes, I have created a general class MyUtils
I made a class from Linq to SQL Clasees with VS 2008 SP1 Framework
I made a class that derives from Component: public class MyComponent: System.ComponentModel.Component { }
I made a code that translate strings to match each word from the array
I'm using boost for several C++ projects. I recently made a upgrade (1.33.1 to
I have a class that is currently in a .lib file: class __declspec(dllexport) ReportData

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.