gpt4 book ai didi

c# - 使用System.Net.HttpListener时,是否有一种方法可以启用SO_REUSEADDR套接字选项?

转载 作者:行者123 更新时间:2023-12-03 12:04:28 24 4
gpt4 key购买 nike

现在已经搜索了一个多小时,并且在文档和网络示例中都找不到如何在使用SO_REUSEADDR类时启用HttpListener选项的信息。

我的特定用例在Powershell脚本中,但是即使C#中有答案,也可以。这大约是一成不变的:

$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()并正确关闭套接字。 (是的,我知道-如果事情破裂,请不要这样做)

通常,当我需要监听套接字时,我会使用 SO_REUSEADDR处理无法正确清理的时间,从而使我可以重新启动监听器,而不必等待30分钟使端口再次可用。有没有办法用 HttpListener做到这一点,而我只是想念它?

最佳答案

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

原因是HttpListener实际上并不管理底层套接字-它只是向HTTP.sys驱动程序注册应用程序级前缀,而后者又管理底层连接。

要使用SO_REUSEADDR,可以创建一个 TcpListener ,并使用Server在底层套接字(可通过SetSocketOption()属性访问)上设置socket选项:

$TcpListener = New-Object System.Net.Sockets.TcpListener 9999
$TcpListener.Server.SetSocketOption("Socket", "ReuseAddress", 1)
$TcpListener.Start()

但是现在您必须实现 HttpListener自己提供的所有方便的功能( header 解析,内容验证等)。

话虽如此,这可能会解决您面临的实际问题:
try{
$Listener.Start()
}
catch{
}
finally{
$Listener.Stop()
$Listener.Dispose()
}

(不要将其粘贴到您的提示/ISE中,您需要将其保存到脚本中,或封闭在脚本块中,以便在中断时正确评估 finally)

关于c# - 使用System.Net.HttpListener时,是否有一种方法可以启用SO_REUSEADDR套接字选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com