首先,请看这个问题理解我所提到的内容。
当我尝试在 Windows 操作系统中通过 UDP 关闭无法访问的 IP 的套接字时,出现了三秒的延迟。
从结果中可以看出,Windows 操作系统有三秒的延迟。但 Ubuntu 没有延迟,也就是说问题与 Windows 操作系统有关。如何将三秒的延迟减少为零?
Windows 无法访问 IP 的套接字关闭时间(使用 UDP):3 秒
Ubuntu 无法访问 IP 的套接字关闭时间(使用 UDP):0 秒
提前致谢...
答案1
这是一个愚蠢的例子。网文档采用无连接协议并使用 connect(),这样它就可以疯狂地阻塞,并且几乎肯定会在最后等待几秒钟,等待 ICMP 不可达或许到达:
https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=netframework-4.7
这是关于在 Windows 中如何快速退出该 UDP 套接字的答案:
(恕我直言,如果尊敬UDP 试图实现的功能是使用异步发送/接收,将 Linger 设置为false
,并将发送和接收超时设置为较小的毫秒数(尽管它们并不重要)...然后直接终止而不进行清理...)
说真的,这是微软详细说明其工作原理:
https://stackoverflow.com/questions/4160347/close-vs-shutdown-socket?rq=1
这篇文章讨论了将句柄设置为非阻塞的重要性(在 Windows 中 SOCK_STREAM 默认阻塞)。
https://stackoverflow.com/questions/17058224/concept-of-non-blocking-socket-functions-using-wsawaitformultipleevents?rq=1
这是一种更便携的方法(而不是处理窗口setsocketopt() or similar
- poll()
或者select()
在关机之前)
https://stackoverflow.com/questions/16163260/setting-timeout-for-recv-fcn-of-a-udp-socket?rq=1
以下是Python提醒我们,如果你发送 UDP,你不应该期望任何返回。同时解释错误:
https://stackoverflow.com/questions/34242622/windows-udp-sockets-recvfrom-fails-with-error-10054?rq=1
你真的不如果你要离开,就需要关闭你的 UDP 套接字。做个懒汉。
https://stackoverflow.com/questions/19819927/when-to-close-a-udp-socket?rq=1
至少可以重复使用 setsocketopt() 以防您以后需要它(比如,在循环中)。
如果您仍然不相信的话,请参考 Close 与 Shutdown (TCP,主要):
https://stackoverflow.com/questions/4160347/close-vs-shutdown-socket?rq=1
以下是您应该自己清理的一些原因:
https://stackoverflow.com/questions/12776563/what-is-the-drawback-if-i-do-not-invoke-the-udpclient-close-method