c++ - 如果服务器未运行,async_connect 成功

标签 c++ boost boost-asio

我正在尝试检查 boost::asio::async_connect 是否成功,但我没有收到错误,即使服务器未启动。如何正确检查是否成功?谢谢!

main.cpp

#include <boost/asio.hpp>

#include "tcp_client.h"
typedef boost::asio::ip::tcp tcp;
int main(int argc, char* argv[])
{
    char host[16] = "127.0.0.1";
        boost::asio::io_service io_service;
        TCP_Client client(host, io_service);
        io_service.run();
    return 0;
}

tcp_client.h

#pragma once

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

typedef boost::asio::ip::tcp tcp;

class TCP_Client
{
public:
    TCP_Client(std::string newHost, boost::asio::io_service& io_service);

private:
    void handle_connect(const boost::system::error_code& error);
    boost::asio::ip::tcp::socket socket;
    boost::asio::ip::tcp::acceptor acceptor;
};

tcp_client.cpp

#include "tcp_client.h"

TCP_Client::TCP_Client(std::string host, boost::asio::io_service& io_service)
    : socket(io_service), acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 12121))
{
    tcp::resolver resolver(socket.get_io_service());
    tcp::resolver::query query(host, "12121");
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::async_connect(socket, endpoint_iterator, boost::bind(&TCP_Client::handle_connect, this, boost::asio::placeholders::error));
}

void TCP_Client::handle_connect(const boost::system::error_code& error)
{
    if (!error && socket.is_open())
    {
        std::cout << "Connected" << std::endl;
    }
    else
    {
        std::cout << "Error handle connect:" << error << std::endl;
    }
    int a;
    std::cin >> a;
}

最佳答案

你有一个接受器绑定(bind)到端口:

... acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 12121)) ...

所以你正在与自己建立联系。您的客户端不需要也不应该有 TCP 接受器,除非它应该接受 TCP 连接。

关于c++ - 如果服务器未运行,async_connect 成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43916701/

相关文章:

c++ - 如果 BGL 中的 add_vertex 检查顶点是否存在

c++ - 为现有变量创建 boost::shared_ptr

c++ - boost/asio async_read() TCP 服务器 - 了解 io_service.run() 在 linux 上

c++ - std::bind 是否应该与 boost::asio 兼容?

c++ - 将 boost-di 与配置文件和共享库一起使用

boost-asio - 无服务器 P2P UDP 聊天

c++ - 全屏小部件

c++ - libevent 是否允许在不同的线程中运行定时器/io 的回调?

c++ - 仅打印 QPlainTextEdit 文档纯文本

c++ - 试图理解 auto_ptr