我正在尝试从 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,会不会是它的原因?