0

我正在尝试从 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);

但它仍然没有帮助。

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

PS它需要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。

PS 我设置了 SO_REUSADDR,会不会是它的原因?

4

1 回答 1

1

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

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

  • 有很多待处理的传出数据,并且
  • 你设置了一个正的 SO_LINGER 超时。

您只能通过将 SO_LINGER 超时设置为 >= 20 秒并且有大量待处理的传出数据以及可能没有读取的对等方来获得 20 秒的延迟。

如果您将 SO_LINGER 完全单独留下,您应该将其设置为 false,或设置为 true 且超时为零,closesocket()则它是异步的并立即返回,在后一种情况下,您还需要重置连接。

因此,要么您没有完成您声称的事情,要么您的观察结果有误。可能是决赛send()是阻塞的。

知道这个closesocket()调用是否返回 -1 以及错误值是什么会很有趣。

于 2015-01-29T19:34:25.790 回答