Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? 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