You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Boost Asio的Daytime TCP客户端出现段错误求助

解决Daytime TCP客户端的段错误问题

核心问题:未检查命令行参数

你的代码直接使用argv[1]作为服务器地址,但如果运行程序时未传入任何命令行参数,argv[1]会是空指针,访问空指针直接触发段错误——这是导致你当前问题的最直接原因。

修复步骤

  • 添加命令行参数校验:在使用argv[1]前,先判断参数数量是否符合要求,避免访问空指针
  • 移除无用代码:代码中创建的steady_timer未被使用,且所有网络操作都是同步执行的,io.run()完全没必要保留
  • 修正错误提示逻辑:原代码中把EOF(连接被服务器正常关闭)判定为"No Errors"不符合逻辑,可调整为更准确的提示

修复后的完整代码

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

using boost::asio::ip::tcp;

int main(int argc, char *argv[])
{
    std::cout << "Started" << std::endl;

    // 校验命令行参数
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " <server>" << std::endl;
        return 1;
    }

    try{
        boost::asio::io_context io;

        tcp::resolver resolver(io);
        tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "daytime");

        tcp::socket socket(io);
        boost::asio::connect(socket, endpoints);

        boost::array<char,128> buf;
        boost::system::error_code error;

        size_t len = socket.read_some(boost::asio::buffer(buf), error);

        if (error == boost::asio::error::eof)
        {
            std::cout << "Connection closed by server after data transfer" << std::endl;
        }
        else if(error){
            throw boost::system::system_error(error);
        }

        std::cout << "Data is: ";
        std::cout.write(buf.data(), len);
        std::cout << std::endl;
    }
    catch(std::exception& e){
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

补充说明

你提到的buffer函数防缓冲区溢出是有效的:Boost Asio的buffer会自动管理缓冲区大小,read_some最多只会读取缓冲区能容纳的字节数(此处为128字节),这部分不会导致溢出问题,你的段错误完全来自未处理命令行参数为空的情况。

内容的提问来源于stack exchange,提问作者sea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:38:32