基于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
相关产品推荐
相关产品推荐

