recv 问题时套接字关闭

Posted

技术标签:

【中文标题】recv 问题时套接字关闭【英文标题】:Socket close while recv issue 【发布时间】: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的建议同样无关紧要。 【参考方案1】:

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

【讨论】:

shutdown 或 close 都没有解除对 recv() 的阻塞。它在客户端关闭连接后解除阻塞。 您是否将其关闭输入

以上是关于recv 问题时套接字关闭的主要内容,如果未能解决你的问题,请参考以下文章

如果达到超时,gen_tcp:recv/3 是不是会关闭套接字?

C++ 套接字 recv() 系统调用返回 -1

远程主机终止后,Recv() 调用挂起

在套接字库中调用 recv 时,我的 recv 缓冲区应该有多大

C 套接字可以在没有客户端关闭连接的情况下接收 0 个字节吗?

TCP:recv() 获取 ECONNRESET