【问题标题】:No ethernet connection but SSL_write() return true没有以太网连接,但 SSL_write() 返回 true
【发布时间】:2021-10-29 21:27:15
【问题描述】:

我想检查 ssl_write 函数是否能够正确传输数据。

即使没有互联网连接,ssl_write 函数也会返回正值。

我想做这样的事情。

if (SSL_write(ssl, chars, strlen(chars)) <= 0)
{
  Init();
}

else
{
  ....
}

即使没有互联网连接,它如何仍然返回正值?

【问题讨论】:

  • This answer 可能会提供您正在寻找的功能(通过 getsockopt() 检查套接字的状态)。
  • @Peter-ReinstateMonica:我怀疑这是否有帮助。如果套接字已经检测到错误,那么sendSSL_write 也会失败。
  • @SteffenUllrich 啊,我明白了。与不知道的仅侦听服务器相反?那个人不应该也收到信号吗?
  • @Peter-ReinstateMonica:我不太明白你最后的评论。也许我试图重申我的观点:套接字是否被认为工作。如果不是全部发送,SSL_write 和 getsockopt 将显示错误,但如果它被认为有效,则不会显示错误。包括暂时中断连接在内的一些数据包丢失不被视为错误,因为 TCP 被设计为对此具有鲁棒性。
  • @SteffenUllrich getsockopt() 的答案是关于服务器侦听的套接字,而不是尝试写入的 OP 用例。正如您所说,写入将在与 getsockopt() 指示错误的相同情况下失败;但是服务器需要主动执行其中一项以检测失败状态。 (这就是为什么链接的答案在服务器案例中很有帮助,但在这里没有任何好处,正如您所指出的那样。)然后我想知道当套接字“停止工作”时服务器是否不会收到信号。我猜不是。

标签: c++ c sockets ssl openssl


【解决方案1】:

SSL_write 仅在内部使用套接字send 函数,如果返回成功,则 SSL_write 也将返回成功。 send 只会将数据放入套接字的发送缓冲区,如果可行,即如果套接字缓冲区中有足够的空间并且底层 TCP 连接仍然建立,则返回成功。然后内核将尝试将数据传递给对等方。因此,sendSSL_write 都不会提供任何信息,如果数据实际上是通过线路传输到对等方甚至被对等方接收到的

TCP 可以应对物理连接的临时中断。它只会尝试重新传输数据包。只有当这些重传经常失败(即对等方没有返回 ACK)时,TCP 连接(以及套接字)才会被认为是断开的。只有这样send 才会失败,这也意味着只有这样SSL_write 才会失败。

【讨论】:

  • 这引出了一个问题,是否有一种标准方法可以确定套接字底层的物理连接是否存在?
  • @Peter-ReinstateMonica:了解 本地 物理连接只能提供非常有限的信息,因为连接可能会在到达最终目标的途中中断。 TCP 在交换长数据时检测到传递问题,因为它期待传递的确认。 TCP keep-alive 甚至通过定期发送某种心跳数据包,在空闲连接上提供早期检测连接问题。
  • 当然,但最好检测一些故障(电缆移除、WLAN 重启)而不是完全不检测,对吧?
  • @AndrewHenle 我不知道我在暗示 ;-)。
  • @Peter-ReinstateMonica 但这正是您想要的 - 为从头开始设计为透明可靠的协议提供快速错误指示。您提倡的快速错误指示要么会破坏透明的可靠性,要么会破坏协议本身。如果一个协议想要可靠,它就不能一出现问题就立即放弃。您是否真的希望每次无线 LAN 或手机的连接因间歇性干扰而中断几秒钟时出现一堆应用程序错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2021-01-23
  • 2012-10-10
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多