Windows 中对套接字的 closesocket() 调用需要 20 秒 [关闭]

Posted

技术标签:

【中文标题】Windows 中对套接字的 closesocket() 调用需要 20 秒 [关闭]【英文标题】:closesocket() call on socket in windows takes 20 sec [closed] 【发布时间】:2015-01-29 15:15:42 【问题描述】:

我正在尝试从 closesocket() 关闭 Windows 上的套接字,但需要 20 秒才能完成。起初我以为是关于 linger 间隔,虽然我没有用 linger 的 setsockopt 设置任何东西,所以我添加了这样的代码:

linjer lobj;
lobj.l_onoff = 1;
lobj.l_linger = 0;

sz = sizeof(lobj);

setsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, sz);

但它仍然没有帮助。

有什么想法吗?我只是想关闭连接,不管是优雅还是流产,只想尽快关闭它。

附:正好需要 20 秒。

lobj.l_onoff = 1; 
lobj.l_linger = 0; 
sz = sizeof(lobj); 
setsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, sz);
lobj.l_onoff = -1;
lobj.l_linger = -1; 
getsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, &sz); 
log << "Option 1:" << lobj.l_linger << ".\n"; 
log << "Option 2:" << lobj.l_onoff << ".\n";
closesocket(s_);

此代码打印 option1 = 0 和 option2 = 1,因此它确实正确设置了 option。

另外,从wireshark观察,它在整个延迟开始时发送RST。

另外,closesocket() 返回 0。

附:我设置了 SO_REUSADDR,会不会是它造成的?

【问题讨论】:

请包含显示问题的完整工作代码。 很遗憾我不能,我可以回答任何问题但不能粘贴代码,对此很抱歉 你试过l_onoff = 0吗?或者SO_DONTLINGER ? 是的,正如我在添加此代码之前所说的,我没有使用 setsockopt 设置任何内容,所以它是 l_onoff=0,我也检查了 getsockopt 如果是 TCP 套接字:你会在套接字上调用 shutdown(SD_BOTH) 吗?否则,套接字实现可能必须等到所有数据都发送完毕并且在连接上没有接收到更多数据。 【参考方案1】:

如果您无法发布代码,则无法在此处提问。这些是规则。

但是,closesocket() 可以花费任何可衡量的时间的唯一方法是:

有大量未决的传出数据,并且 您设置了一个正的 SO_LINGER 超时。

您只能通过设置一个大于等于 20 秒的正 SO_LINGER 超时来获得 20 秒的延迟并且有很多待处理的传出数据并且可能是一个对等体没有读。

如果您完全不理会 SO_LINGER(您应该这样做),或者将其设置为 false 或 true 且超时为零,closesocket() 是异步的并立即返回,在后一种情况下您还需要重置连接。

Ergo 要么你没有做你声称的事情,要么你的观察是错误的。可能是最后一个 send() 阻塞了。

想知道这个closesocket() 调用是否返回-1,如果是,错误值是什么。

【讨论】:

使用该套接字的整个代码都很大,我只能发布我们感兴趣的部分:) 请在您的问题中发布您的代码您可以亲眼看到它在 cmets 中发布时完全难以辨认。我什至不想尝试破译那个烂摊子。 对此感到抱歉。是的,我不确定,但我认为对等方没有读取数据,可能是某些数据正在重新传输,但我想关闭该连接,无需等待。 您确定要关闭您设置 abortive LINGER on 的同一个套接字? 是的,在那个代码之后 closesocket(s_)

以上是关于Windows 中对套接字的 closesocket() 调用需要 20 秒 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++11 中对 boost::asio 套接字对象重复 std::move

为啥在 python 中对 asyncio 服务器的多个请求的时间会增加?

在 C# 中对 dataGridView 列进行排序? (Windows 窗体)

在 C# Windows 窗体中对字典进行排序[重复]

如何在 Windows 8.1 应用程序中对 XAML 网格视图进行排序?

在 Windows/Linux/Mac 上的 Java 程序中对全局热键做出反应?