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

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;
}

验证步骤

  1. 用修复后的编译命令编译程序
  2. 运行服务端:./main,此时会看到输出"等待客户端连接..."
  3. 打开新终端,用nc工具测试连接:
nc localhost 1326

连接成功后会收到字符"e",服务端也会输出"已发送消息给客户端"并退出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:31:03