ASIO TCP服务器运行时终端挂起,无输出且无法向客户端发数据
问题排查与修复方案
1. 编译命令缺失必要依赖
你的编译命令未链接ASIO在Linux下运行必需的线程库,且未指定C标准版本(ASIO对C标准有最低要求),正确编译命令应为:
g++ main.cpp -o main -I include -lpthread -std=c++17
(注:Linux下无需后缀.exe,直接命名为main更符合系统习惯)
2. 程序挂起的核心原因
代码中的acceptor.accept(socket)是阻塞式调用,程序会停在这一行,直到有客户端主动连接到1326端口,这是TCP服务端的正常等待逻辑,并非程序故障。
3. 无输出的原因:输出缓冲区未刷新
std::cout << "hi";未触发输出缓冲区刷新,Linux下标准输出默认是行缓冲,需添加换行符或手动刷新才能立即看到内容:
// 方式1:用endl自动刷新缓冲区 std::cout << "等待客户端连接..." << std::endl; // 方式2:手动调用flush std::cout << "hi"; std::cout.flush();
修复后的完整代码
#define ASIO_STANDALONE #include <ctime> #include <iostream> #include <string> #include <asio.hpp> using asio::ip::tcp; int main() { try { asio::io_context io_context; tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 1326)); for (;;) { std::cout << "等待客户端连接..." << std::endl; tcp::socket socket(io_context); acceptor.accept(socket); std::string message = "e"; asio::error_code ignored_error; asio::write(socket, asio::buffer(message), ignored_error); std::cout << "已发送消息给客户端" << std::endl; break; } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; }
验证步骤
- 用修复后的编译命令编译程序
- 运行服务端:
./main,此时会看到输出"等待客户端连接..." - 打开新终端,用
nc工具测试连接:
nc localhost 1326
连接成功后会收到字符"e",服务端也会输出"已发送消息给客户端"并退出
内容的提问来源于stack exchange,提问作者WonderGames
相关产品推荐
相关产品推荐

