在窗口中对socket进行closesocket()调用需要20秒

时间:2015-01-29 15:15:42

标签: c++ windows sockets delay closesocket

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

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

sz = sizeof(lobj);

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

但它仍无济于事。

任何想法?我只想关闭连接,无论是优雅还是堕胎都无关紧要,只想尽快关闭它。

P.S。它需要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,因此它确实正确设置了选项。

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

plus,closesocket()返回0。

P.S。我设置了SO_REUSADDR,它可以导致它吗?

1 个答案:

答案 0 :(得分:1)

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

然而,closesocket()可以采取任何可衡量的时间的唯一方法是:

  • 有很多待处理的传出数据,
  • 您已设置正SO_LINGER超时。

通过设置正的SO_LINGER超时&gt; = 20秒有大量待处理的传出数据可能是对等方,您只能获得20秒的延迟那不是读书。

如果您严格单独使用SO_LINGER,或者将其设置为false,或者将零超时设为true,则closesocket()是异步的并立即返回,在后一种情况下,您也可以重置连接。

Ergo 要么你没有完成你所宣称的或你的观察是错误的。可能是最后send()阻止。

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