Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
我正在尝试从closesocket()关闭Windows上的套接字,但需要20秒才能完成。起初我以为这是关于延迟间隔的,尽管我没有使用linger用setsockopt设置任何内容,所以我添加了以下代码:
但这仍然无济于事。
有任何想法吗?我只想关闭连接,不管它是宽容还是堕胎,都只想尽快关闭它。
附言大约需要20秒。
此代码显示option1 = 0和option2 = 1,因此它确实正确设置了option。
同样,从wireshark观察,它在整个延迟开始时发送RST。
另外,closesocket()返回0。
附言我已经设置了SO_REUSADDR,是否会导致这种情况?
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
我正在尝试从closesocket()关闭Windows上的套接字,但需要20秒才能完成。起初我以为这是关于延迟间隔的,尽管我没有使用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,是否会导致这种情况?
最佳答案
如果您无法发布代码,则无法在此处提出问题。这些是规则。
但是,closesocket()
完全可以花费任何可衡量的时间的唯一方法是:
有很多待处理的传出数据,并且
您已将SO_LINGER设置为正超时。
通过将正的SO_LINGER超时设置为> = 20秒,并且拥有大量待处理的传出数据,并且可能有一个未读取的对等体,您只能得到20秒的延迟。
如果您严格将SO_LINGER留给自己,或者应将其设置为false或将其设置为true且超时为零,则closesocket()
是异步的并立即返回,在后一种情况下,您还将重置连接。
抱歉,您尚未完成所声称的操作或观察结果有误。可能是最后的send()
被阻止了。
知道此closesocket()
调用是否返回-1以及是否返回错误值将是很有趣的。
10-07 22:17