现在已经搜索了一个多小时了,我在网络上的文档和示例中都没有找到如何在使用hashHistory
类时启用SO_REUSEADDR
选项。
我的特定用例是在Powershell脚本中,但即使在C#中有答案,也没关系。这大约和它一样干脆:
HttpListener
有些时候我$Listener = New-Object System.Net.HttpListener
$Listener.Prefixes.Add('http://+:9999/')
Try
{
$Listener.Start()
# While loop here to handle requests; omitted for brevity
}
Catch
{
# omitted here for brevity
}
在测试时突破脚本,并且以这种方式离开循环不允许调用Ctrl-C
并正确关闭套接字。 (是的,我知道 - 如果它破坏了东西就不要这样做)
通常情况下,当我需要一个侦听套接字时,我会使用$Listener.Stop()
来处理那些事情没有正确清理的时间,以便让我重新启动我的监听器而不必等待30分钟才能使端口进入再次可用。有没有办法用SO_REUSEADDR
执行此操作,我只是错过了它?
答案 0 :(得分:1)
不,您不能将SO_REUSEADDR
与HttpListener
一起使用。
原因是HttpListener
实际上并没有管理底层套接字 - 它只是向HTTP.sys
驱动程序注册应用程序级前缀,而SO_REUSEADDR
驱动程序又管理底层连接。
要使用Server
,您可以使用SetSocketOption()
创建TcpListener
并在底层套接字上设置套接字选项(可通过$TcpListener = New-Object System.Net.Sockets.TcpListener 9999
$TcpListener.Server.SetSocketOption("Socket", "ReuseAddress", 1)
$TcpListener.Start()
属性访问):
HttpListener
但是现在你必须实现try{
$Listener.Start()
}
catch{
}
finally{
$Listener.Stop()
$Listener.Dispose()
}
提供的所有方便的东西(标题解析,内容验证等)。
话虽如此,这可能会解决您面临的实际问题:
finally
(不要将其粘贴到您的提示/ ISE中,您需要将其保存到脚本中,或者将其封装在脚本块中以便{... 1}}在中断时正确评估)