【问题标题】:boost read() never returns eventhough write executed on server (ssl) boost即使在服务器(ssl)上执行了写入, boost read() 也永远不会返回
【发布时间】:2015-10-24 11:18:22
【问题描述】:

我有一个异步运行的服务器和一个同步运行的客户端。

客户端和服务器进行握手,然后进行 SSL 握手。客户端向服务器发送消息,服务器读取消息(我可以正确打印出来),然后服务器发回响应boost::async_write。响应离开服务器,读取正在客户端boost::read() 上执行,但客户端永远不会从读取命令返回。最终请求超时并引发异常(请求超时)。

服务器是异步的,客户端是同步的。

请注意,如果没有 SSL,一切都会正常工作,但如果使用 SSL,上述场景就会展开。我在 Wireshark 中查看过握手工作正常,并且 SSL 和 TCP 握手都是正确的。另外,当客户端发送第一条消息boost::write()时,服务器可以完美地解密和读取它(boost::read_async)。服务器完美地发回消息(boost:write_async)......但客户端由于某种原因永远不会从阅读中返回! (仅在 SSL 情况下,正常 TCP 工作正常)。

Boost 版本是 1.48 ......我真的很困惑 TCP 怎么能正常工作而 SSL 不能工作(但根据上面的场景,它与加密方面无关)​​。在 boost 中我必须做的事情与我目前所做的不同吗?

【问题讨论】:

  • 这是一个编程问题,还是应该放在服务器故障上的问题?
  • 我会这样认为,因为结果可能是一些需要使用 boost 更改的代码?
  • 一些代码比如什么?
  • 我会假设...在读取功能中我需要更改某些内容...或者可能需要在消息末尾添加某种类型的分隔符?它可能与一种方式是同步的,另一种是异步的(使用 ssl?)有关。
  • 由于您使用的是加密流,它们至少会缓冲到另一个块,可能是 16 个字节,但取决于加密算法。尝试在写入后在两端刷新流。

标签: c++ sockets ssl boost tcp


【解决方案1】:

问题是由于某种原因,我传入的其中一条消息的标头超出了范围。在函数的堆栈上声明一个标头,然后将其传递给异步发送并不能保证该标头的内存已完全传递给函数。在异步情况下,标头必须具有更持久的范围(例如堆、成员变量等)。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多