如何制作非阻塞服务器

时间:2019-10-28 09:06:51

标签: c++11 boost boost-asio asyncsocket

我想拥有一个非阻塞服务器来读取应用程序中的传入数据。

这是我想要的工作流程。

void main()
{

 // create a socket server
  CreateSocket();
  while( true )
   {
      // keep doing the other tasks.
      // if we receive a message than process it
   }    
}

这是Socket连接的代码

#pragma once
//importing libraries
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost::asio;
using ip::tcp;
using std::cout;
using std::endl;


class con_handler : public boost::enable_shared_from_this<con_handler>
{
private:
    tcp::socket sock;
    std::string message = "Hello From Server";
    enum { max_length = 2048};
    char data[max_length];

public:
    typedef boost::shared_ptr<con_handler> pointer;
    con_handler(boost::asio::io_service& io_service) : sock( io_service) {}

    // creating the pointer
    static pointer create(boost::asio::io_service& io_service)
    {
        return pointer(new con_handler(io_service));
    }

    // socket creation
    tcp::socket& socket()
    {
        return sock;
    }

    void start()
    {
        sock.async_read_some(
            boost::asio::buffer(data, max_length),
            boost::bind(&con_handler::handle_read,
                shared_from_this(),
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
    }


    void handle_read(const boost::system::error_code& err, size_t bytes_transferred)
    {
        if (!err) {
            cout << data << endl;
        }
        else {
            std::cerr << "error: " << err.message() << std::endl;
            sock.close();
        }
    }
    void handle_write(const boost::system::error_code& err, size_t bytes_transferred)
    {
        if (!err) {
            cout << "Server sent Hello message!" << endl;
        }
        else {
            std::cerr << "error: " << err.message() << endl;
            sock.close();
        }
    }
};

///////////////////////////////////////////////// /////////

#pragma once
#include "TCP_Server.h"

class Server
{
private:
    tcp::acceptor acceptor_;
    void start_accept()
    {
        // socket
        con_handler::pointer connection = con_handler::create(acceptor_.get_io_service());

        // asynchronous accept operation and wait for a new connection.
        acceptor_.async_accept(connection->socket(),
            boost::bind(&Server::handle_accept, this, connection,
                boost::asio::placeholders::error));
    }
public:
    //constructor for accepting connection from client
    Server(boost::asio::io_service& io_service) : acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234))
    {
        start_accept();
    }
    void handle_accept(con_handler::pointer connection, const boost::system::error_code& err)
    {
        if (!err) {
            connection->start();
        }
        start_accept();
    }
};

当前套接字连接正在工作,但正在阻止其他进程。

此工作流程是否需要一个单独的线程,或者可以在同一线程中执行?

这是我的主要功能

#include "pch.h"
#include <iostream>
#include "Server.h"

int main()
{
        boost::asio::io_service io_service;
        Server server(io_service);
        io_service.run();

    while (true)
    {
        std::cout << " function is running Running";    
    }
}

我能够接收输入消息,但我从未到达while语句。

我希望同时打印并让服务器同时接收消息。

0 个答案:

没有答案