C++提升tcp服务器

C++ boost tcp-server

本文关键字:服务器 tcp 提升 C++      更新时间:2023-10-16

我试图用boost-libs创建一个tcp服务器。我基本上是从boost中获取示例代码(整个代码在那里的一个文件中),并将其拆分为一个类。

那里好像出了什么问题,我真的不知道缺了什么。

主要错误是在"tcp_server.cpp"的末尾,我将错误消息放在那里的注释中。看起来他不知道函数会话(至少我是这么解释的),我在"tcp_server::session"answers"this->session"中得到了同样的错误。

第二件事是我从"e.what()"中得到的一个错误(无法解析identifier-what)。它在示例代码中起作用,在异常情况下我没有更改任何内容。

提前谢谢。

tcp_server.h

#include <cstdlib>
#include <iostream>
#include <exception>
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
using boost::asio::ip::tcp;
class tcp_server
{
public:
typedef boost::shared_ptr<tcp::socket> socket_ptr;
tcp_server();
~tcp_server();
void server(boost::asio::io_service&);
private:
const short port = 8888;
const int max_length = 1024;
void session(socket_ptr);
};

tcp_server.cpp

#include "tcp_server.h"

tcp_server::tcp_server()
{
}
tcp_server::~tcp_server()
{
}

void tcp_server::session(socket_ptr sock)
{
try
  {
    for (;;)
    {
      char data[max_length];
      boost::system::error_code error;
      size_t length = sock->read_some(boost::asio::buffer(data), error);

      if (error == boost::asio::error::eof)
        break; // Connection closed cleanly by peer.
      else if (error)
        throw boost::system::system_error(error); // Some other error.
      boost::asio::write(*sock, boost::asio::buffer(data, length));
    }
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception in thread: " << e.what() << "n"; //
  }
}

void tcp_server::server(boost::asio::io_service& io_service)
{
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
  for (;;)
  {
    socket_ptr sock(new tcp::socket(io_service));
    a.accept(*sock);
    boost::thread t(boost::bind(session, sock)); //error: no matching function for call to ‘bind(<unresolved overloaded function type>, tcp_server::socket_ptr&)’`
  }
}

main.cpp

#include "tcp_server.h"

int main() {
    tcp_server server;
    try
  {
    boost::asio::io_service io_service;
    server.server(io_service);
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "n";
  }
  return 0;
}

您不能bind非静态成员函数tcp_server::session,因为在没有对象实例的情况下无法调用它,而对象实例对绑定不可用。

但是,您可以将tcp_server::session设置为静态(在tcp_header.h中)来修复此问题:

static void session(socket_ptr);

编辑:

您可以使用将会话绑定为非静态成员

boost::thread t(boost::bind(&tcp_server::session, this, sock));