【问题标题】:Socket close while recv issuerecv 问题时套接字关闭
【发布时间】:2015-01-30 23:15:22
【问题描述】:

Ubuntu 14.04。如果 recv() 在打开的连接上等待数据时被阻塞,则从另一个线程调用的 close()shutdown() 不会导致 recv() 在对等方关闭连接之前返回。

如何解除对recv() 的屏蔽?

我在 Thrift 的 TServerSocket 类中发现了这种行为。

【问题讨论】:

  • 是socket set的keep alive等选项吗?您可以尝试取消设置吗?
  • “在连接打开之前没有强制recv() 返回”是什么意思?你的问题是什么? @fayyazki 这些选项与它到底有什么关系?
  • 我希望在我调用 socket 上的 close 后 recv 会返回。
  • 只有禁用逗留选项。我试图评论它,但这并没有改变行为。
  • 您不需要禁用 linger 选项。默认情况下它是关闭的,最好保持这种状态。关于keepalive的建议同样无关紧要。

标签: c++ sockets ubuntu thrift


【解决方案1】:

您的问题最不清楚,但如果您想在关闭另一个线程中的套接字之前解除阻塞recv(),最好的技术是在关闭之前关闭套接字以进行输入。这将导致recv() 返回零,就好像对等方已关闭连接一样。

【讨论】:

  • shutdown 或 close 都没有解除对 recv() 的阻塞。它在客户端关闭连接后解除阻塞。
  • 您是否将其关闭输入
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多