有没有办法在使用System.Net.HttpListener时启用SO_REUSEADDR套接字选项?

时间:2016-02-10 17:56:58

标签: c# .net sockets powershell

现在已经搜索了一个多小时了,我在网络上的文档和示例中都没有找到如何在使用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执行此操作,我只是错过了它?

1 个答案:

答案 0 :(得分:1)

不,您不能将SO_REUSEADDRHttpListener一起使用。

原因是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}}在中断时正确评估)