简体   繁体   English

Boost ASIO Tcp 客户端/服务器 object 连接问题

[英]Boost ASIO Tcp Client/Server object connect issue

I'm trying to make an "connection handler" for Client and server the server-side works quite well with an other client but when i try to connect a client made the object, i've always the same crash and it appears right after the socket->connect .我正在尝试为客户端和服务器创建一个“连接处理程序”,服务器端与其他客户端一起工作得很好但是当我尝试连接一个客户端时,我总是遇到同样的崩溃,它出现在之后socket->connect

this is the error from the client:这是来自客户端的错误:

terminate called after throwing an instance of 'boost::wrapexcept<boost::system::system_error>'
  what():  bind: Address already in use

this is my TCP.cpp:这是我的 TCP.cpp:

TCP::TCP(TYPE type)
{
    switch (type)
    {
        case (CLIENT):
            setup_client();
        case (SERVER):
            setup_server();
        default:
            break;
    }
}

TCP::~TCP()
{
    _socket->close();
}

void TCP::setup_client()
{
    boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), PORT);
    _socket = new tcp::socket(_io_service);
    _socket->connect(endpoint);
}

void TCP::setup_server()
{
    _acceptor = new tcp::acceptor(_io_service, tcp::endpoint(tcp::v4(), PORT ));  //listen for new connection
    _socket = new tcp::socket(_io_service);  //socket creation 
    _acceptor->accept(*_socket);  //waiting for connection
}

string TCP::read_socket() {
    boost::asio::streambuf buf;
    boost::asio::read_until(*_socket, buf, "\n" );
    string data = boost::asio::buffer_cast<const char*>(buf.data());
    return data;
}

void TCP::send_socket(const string& message)
{
    const string msg = message + "\n";
    boost::asio::write(*_socket, boost::asio::buffer(message) );
}

and this my.hpp:还有这个 my.hpp:

#define PORT 8080

enum TYPE {
    CLIENT,
    SERVER
};

class TCP {
    public:
        TCP(TYPE type);
        ~TCP();
        string read_socket();
        void send_socket(const string& message);

    protected:
    private:
        void setup_server();
        void setup_client();

        boost::asio::io_service _io_service;
        tcp::acceptor *_acceptor;
        tcp::socket *_socket;
};

You're missing a break statement:你缺少一个 break 语句:

TCP::TCP(TYPE type) {
    switch (type) {
    case (CLIENT):
        setup_client();
        break;
    case (SERVER):
        setup_server();
        break;
    default:
        break;
    }
}

This means that your client also tries to open an acceptor on the same port.这意味着您的客户端还尝试在同一端口上打开接受器。 That is normally not allowed.这通常是不允许的。

Simplified简化的

Removing a lot of bug sources:删除大量错误源:

Live On Coliru生活在 Coliru

#define PORT 8383
#include <boost/asio.hpp>
#include <iostream>
using namespace std::chrono_literals;
using boost::asio::ip::tcp;
using boost::system::error_code;

struct TCP {
    enum TYPE { CLIENT, SERVER };

    TCP(TYPE type);
    ~TCP();
    std::string read_socket();
    void send_socket(const std::string& message);

  private:
    boost::asio::io_service _io_service;
    tcp::socket _socket { _io_service };
    tcp::acceptor _acceptor { _io_service };
};

TCP::TCP(TYPE type) {
    if (type == CLIENT) {
        _socket.connect(tcp::endpoint{ {}, PORT});
    } else {
        _acceptor = tcp::acceptor{_io_service, {{}, PORT}};
        //_acceptor.bind({{}, PORT});
        _acceptor.accept(_socket);
    }
}

TCP::~TCP() {
    if (_socket.is_open())   _socket.close();
    if (_acceptor.is_open()) _acceptor.close();
}

std::string TCP::read_socket() {
    std::string data;
    auto n = read_until(_socket, boost::asio::dynamic_buffer(data), "\n");
    data.resize(n);
    return data;
}

void TCP::send_socket(const std::string& message) {
    write(_socket, boost::asio::buffer(message + "\n"));
}

int main() {
    std::thread server_th([&] {
        TCP s(TCP::SERVER);
        s.send_socket("ECHO: " + s.read_socket());
    });

    std::thread client_th([&] {
        std::this_thread::sleep_for(10ms);
        TCP c(TCP::CLIENT);
        c.send_socket("Hello world!");
        std::cout << c.read_socket() << "\n";
    });

    client_th.join();
    server_th.join();
}

Prints印刷

ECHO: Hello world!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM