我试图从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,它可以导致它吗?
答案 0 :(得分:1)
如果您无法发布代码,则无法在此处提出问题。这些是规则。
然而,closesocket()
可以采取任何可衡量的时间的唯一方法是:
通过设置正的SO_LINGER超时&gt; = 20秒和有大量待处理的传出数据和可能是对等方,您只能获得20秒的延迟那不是读书。
如果您严格单独使用SO_LINGER,或者将其设置为false,或者将零超时设为true,则closesocket()
是异步的并立即返回,在后一种情况下,您也可以重置连接。
Ergo 要么你没有完成你所宣称的或你的观察是错误的。可能是最后send()
阻止。
知道这个closesocket()
调用是否返回-1会很有趣,如果是,那么错误值是什么。