boost::asio::ip::tcp::socket 没有读取任何内容

2024-01-10

这实际上是我在套接字编程中的第一个程序,除了复制粘贴教程代码并享受乐趣之外。无论如何它都不起作用。我想我已经仔细阅读了文档,但也许还不够。我怀疑我使用socket::read_some() in read_message()因为我的有问题的程序停在阅读部分。我认为我使用它的方式应该没问题,因为文档socket::read_some()声明“函数调用将阻塞,直到成功读取一个或多个字节的数据,或者发生错误。”下面是我的代码。任何帮助表示赞赏。

void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
    std::stringstream message_stream;
    while (true)
    {
        std::array<char, 128> buffer;
        boost::system::error_code error;
        size_t len = socket.read_some(boost::asio::buffer(buffer), error);
        if (error == boost::asio::error::eof)
        {
            break;
        }
        message_stream.write(buffer.data(), len);
    }
    message = message_stream.str();
}

服务器.cpp

int main()
{
    while (true)
    {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(
            boost::asio::ip::tcp::v4(), 9999));
        boost::asio::ip::tcp::socket socket(io_service);
        acceptor.accept(socket);
        std::cout << "connected with client, waiting for a message\n";
        std::string message;
        read_message(message, socket);
        boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();
        std::cout << "message received from " << endpoint.address().to_string() <<
            ':' << endpoint.port() << '\n' << message << '\n';
        boost::asio::write(socket, boost::asio::buffer(message));
        if (message.compare("quit") == 0)
        {
            break;
        }
    }
    return EXIT_SUCCESS;
}

客户端.cpp

int main()
{
    while (true)
    {
        std::cout << "your message to be sent: ";
        std::string message;
        std::getline(std::cin, message);
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::resolver resolver(io_service);
        boost::asio::ip::tcp::resolver::query query("localhost", "9999");
        boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        boost::asio::ip::tcp::socket socket(io_service);
        boost::asio::connect(socket, endpoint_iterator);
        std::cout << "connected to server\n";
        boost::asio::write(socket, boost::asio::buffer(message));
        read_message(message, socket);
        std::cout << "message received from server: " << message << '\n';
        if (message.compare("quit") == 0)
        {
            break;
        }
    }
    return EXIT_SUCCESS;
}

问题在于read_message功能:你读到eof,但你会得到eof仅当套接字关闭时。

也许您打算从read_message当遇到一些分隔符时,例如。 '\n'?然后您可以手动检查缓冲区,或使用read_until http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/reference/read_until.html功能。

Using read_until功能,read_message看起来像这样:

void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
  std::stringstream message_stream;
  boost::asio::streambuf buffer;
  boost::system::error_code error;
  size_t len = read_until(socket, buffer, '\n', error);
  if (len)
  {
    message_stream.write(boost::asio::buffer_cast<const char *>(buffer.data()), len);
    message = message_stream.str();
  }
}

请记住将“\n”附加到从客户端发送的消息中:

//...
std::cout << "connected to server\n";
boost::asio::write(socket, boost::asio::buffer(message + '\n'));
read_message(message, socket);
//...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost::asio::ip::tcp::socket 没有读取任何内容 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 什么是概念?

    我听说过所有关于 C 0x 不再有概念的新消息 在 上 但我不知道它们是什么 有人可以向我解释一下吗 概念是一种通用编程功能 允许编写模板代码的人指定类型参数需要满足的要求 例如 某些集合类型需要集合的类型参数来定义 这有点过于简单化 但我
  • 原则 2 选择计数 groupBy

    我正在尝试检索许多具有唯一 uid 的行 qb gt select COUNT as cnt gt from type c gt groupBy c organization c process role c domain c year g
  • 错误:找不到 ActivitySplashBinding

    我正在尝试检查用户是否登录 如果是 则显示特定视图组 否则显示不同的视图组 为了检查用户是否登录 我从共享首选项中获取用户 登录时用户保存在共享首选项中 让我展示我的代码 启动视图模型 public class SplashViewMode
  • 将自定义道具传递给react-router v4中的路由器组件

    我正在使用 React Router 创建一个多页面应用程序 我的主要组成部分是
  • 使用 Swift 向下循环移动 SKSpriteNode

    使用 Swift 和 SpriteKit 我想以螺旋模式移动 SKSpritenode 但没有找到合适的资源来帮助我开始 更准确地说 我想以向下循环的方式移动精灵节点 我检查了一系列 SKActions 但由于它们不是并行执行的 因此与 m
  • 以 PHP5 中的数组形式返回当前日历周的日期

    我如何组合一个 PHP5 函数来查找当前日历周并以数组形式返回一周中每一天的日期 从星期一开始 例如 如果该函数今天运行 2010 年 2 月 25 日星期四 该函数将返回一个如下数组 0 gt Mon Feb 22 2010 br 1 g
  • 为什么 Unicode 字符在数据库中显示正确,但显示为 ?当通过 Hibernate 在 Java 中打印时?

    我正在编写一个 web 应用程序 并使用 Hibernate 3 5 与 MySQL 交互 使用 sukutoppu 作为我的测试字符串 我可以输入该字符串并查看它是否已正确保存到数据库中 但是 当我后来从数据库中提取该值并将其作为字符串打
  • C# 使用 Linq 连接 3 个列表 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想加入 3 个具有以下格式的列表
  • Wireshark 中看到的数据报,Qt UDP Socket 未接收到

    我正在编写一个 Qt 5 6 应用程序 通过 UDP 套接字与 FPGA 进行通信 数据包以 2 KHz 的速率传输到 PC 所有数据包大小相同 1272 字节 Wireshark 显示数据包正在发送 并且 UDP 标头符合预期 问题是 我
  • SmartGWT GWT 客户端服务器架构

    我们计划使用智能GWT GWT和相关框架用于客户端丰富的接口 以及在服务器端返回JSON数据的Spring MVC 作为调查是否符合我们要求的一部分 需要回答以下问题 在不使用任何框架的情况下从头开始构建 GWT 应用程序需要付出大量努力才
  • 使用 DbSet 应用 OrderBy

    我正在尝试使用通用存储库实现分页和排序 如何在 DbSet 中将主键列作为默认按列排序 DbSet Context Set
  • 获取唤醒我的 Activity 的 Intent

    我正在开发一个包含广播接收器的应用程序 广播接收者在 onReceive 上设置一个通知 其中包含一个待处理的 Intent Intent updateHistoryIntent new Intent this NotificationsH
  • IntelliJ 的“UML 支持”插件

    我肯定错过了什么 我在读本文 https www jetbrains com idea help working with diagrams html它说有一个名为 UML Support 的插件默认启用 我没有它 所以我转到 首选项 gt
  • 如何对 HTML 标记属性使用多行值? (即如何转义换行符?)

    如何在 HTML 标记属性中包含换行符 例如 a href somepage html some link a Edit 抱歉 例子不好 如果标签碰巧不在 javascript 中怎么办 比如说
  • 类型 'K' 不能用于索引类型 '{ [key in keyof K]: V; }'.ts(2536)

    我想创建一个从自定义对象类型返回新对象的方法 type K represent the type of key in an object type V represent the type of value in an object cla
  • 使用unix终端解析XML

    有时我需要快速从 XML 文件中提取一些任意数据以放入 CSV 格式 在 Unix 终端中执行此操作的最佳实践是什么 我想要一些代码示例 那么例如我怎样才能解决以下问题 XML 输入示例
  • 分析递归算法 T(n) = T(n - 1) + T(n - 2) + T(n -3)?

    于是 有人发了这个question https stackoverflow com questions 17239861 how would i get the order of algorithm tn tn 1tn 2 tn 3 com
  • 对象当前正在其他地方使用

    我收到此错误 看起来是因为不同的线程正在访问同一个 Bitmap 对象 然而我到处都使用锁 public class MySingleInstanceClass private Object locker new Object privat
  • 添加将 Excel 数据粘贴到 Django 表单中的功能

    我目前有一个 Django 表单 它有 N 行 x 12 列的表格形状的文本框 用户可以一次填充此表单一个文本框 注意 该表仅显示 9 列 但我使用的实际表格是 12 列
  • boost::asio::ip::tcp::socket 没有读取任何内容

    这实际上是我在套接字编程中的第一个程序 除了复制粘贴教程代码并享受乐趣之外 无论如何它都不起作用 我想我已经仔细阅读了文档 但也许还不够 我怀疑我使用socket read some in read message 因为我的有问题的程序停在