解决.net core开发过程中端口总是无缘无故被占用的问题,提示SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试。修改端口还无效

发布时间 2023-12-14 15:57:20作者: RickLee

先给出原因和方案:

    是Hyper-V每次启动随机保留端口段,导致所要使用的端口被系统保留,导致无法使用的问题

 解决方法就是,指定系统保留端口的范围,避开开发时使用的端口即可。powershell 管理员身份使用下面的命令设置。

    netsh int ipv4 set dynamic tcp start=49152 num=16384
    netsh int ipv6 set dynamic tcp start=49152 num=16384 


下边进入故事模式

1、缘起

不知道从哪天开始,启动.net core程序的时候总是报错
  SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试。

用人话的意思就是,端口被占用了

好吧,既然被占用了,那换一个就好了。

然后修改项目下的Properties\launchSettings.json文件,把

"applicationUrl": "http://localhost:6000"

修改为

"applicationUrl": "http://localhost:6001"
 再次启动,故障依旧。可能是改少了。多改点,改成
"applicationUrl": "http://localhost:6060"

再次启动,还是报错,what fuc.....,什么鬼。

重启,嗯,估计是系统偶尔抽风。继续工作。。。

 

2、问题不是想象的那么简单

第二天,开始工作。又报错。。。
老重启也不是办法呀。于是把配置文件修改为
"applicationUrl": "http://localhost:8000"
终于又好了。但是为什么?
各种百度、Bing无果。给出的方案都是端口占用了换一个。
神奇的是,用netstat查看占用的端口,居然找不到,显示没有被占用
开始疑神疑鬼,觉得可能是.net core的框架有什么bug了,导致启动的时候启动两次?然后自己跟自己冲突了?不然无法解释了
从此开始,时不时需要改端口范围的痛苦操作。
好在发布的程序在别的机器上运行都没有问题。也就先这样了。
某一天发现,有些软件启动时,也会有端口被占用的问题。看来不一定是.net core的问题。也许那些软件也用的.net core写的呢?
 

3、问题大爆发,终于有了解决方案

终于有一天,
6000,7000,9000段端口全部被占用了。
看来是要下决心解决这个问题了。
bing外网,找到类似端口占用的问题。始终未发现说.net core相关的bug,发现有提示用
net stop winnat
net start winnat
重启winnat服务的方式可以解决。
马上试了试,真香!
果然好了,写了个批处理,哪天有问题就运行下。
省事多了,最起码不用重启不用改端口了。
 

4、知其然,还要知其所以然,真相终于大白

但是,为什么,不弄明白,实在是不甘心。
既然从故障入手找不到方案,那就从解决的办法入手。百度关键词winnat 端口占用
找到了这篇文章:Windows端口莫名占用
  https://zhuanlan.zhihu.com/p/661398276
顺藤摸瓜又找到了这篇:解决 Windows 10 端口被 Hyper-V 随机保留(占用)的问题
https://zhaoji.wang/solve-the-problem-of-windows-10-ports-being-randomly-reserved-occupied-by-hyper-v/
至此终于找到根源,原来是之前开启Hyper-V虚拟机之后,导致的端口被随机保留的问题。所以netstat也找不到是哪个程序占用了端口(没有占用【使用】当然找不到)
按照文章所给出的方案用管理员执行以下命令
netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384
 
至于是否有效,我相信找到这里肯定没问题了。记录下来,又增长了系统的知识