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 是不是会关闭套接字?
在套接字库中调用 recv 时,我的 recv 缓冲区应该有多大