【发布时间】:2015-01-29 15:15:42
【问题描述】:
我正在尝试从 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);
但它仍然没有帮助。
有什么想法吗?我只是想关闭连接,不管是优雅还是流产,只想尽快关闭它。
附:正好需要 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,会不会是它造成的?
【问题讨论】:
-
请包含显示问题的完整工作代码。
-
很遗憾我不能,我可以回答任何问题但不能粘贴代码,对此很抱歉
-
你试过
l_onoff = 0吗?或者SO_DONTLINGER? -
是的,正如我在添加此代码之前所说的,我没有使用 setsockopt 设置任何内容,所以它是 l_onoff=0,我也检查了 getsockopt
-
如果是 TCP 套接字:你会在套接字上调用 shutdown(SD_BOTH) 吗?否则,套接字实现可能必须等到所有数据都发送完毕并且在连接上没有接收到更多数据。
标签: c++ windows sockets delay closesocket