有一个ASP.NET Core的项目,使用了一个固定端口13501
, 突然有一天,启动项目时,报System.Net.Sockets.SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试
的异常,无法监听端口。
此时第一反应是其他程序占用了13501
端口,于是在cmd(出于bug敏感,直接以管理员身份启动)中执行netstat -ano | findstr 13501
,发现啥也没有,说明不是被其他程序占用了,但是为何不让我监听使用呢?
经过一番搜索/尝试/验证后,似乎在Stack Overflow上找到了方向:
Kestrel unable to start
在cmd尝试执行netsh interface ipv4 show excludedportrange protocol=tcp
, 果然发现了13501
是在排除范围之内(13492~13591):
那么就想,能否移除这条规则呢,通过搜索来的命令,修改相关端口范围后执行:netsh interface ipv4 delete excludedportrange protocol=tcp startport=13492 numberofports=100
果然发现自己还是太天真了。。。那怎么办呢?虽然曾经遇到这个问题后浅尝辄止,搞不定后直接重启,每次都可以解决,但是系统任务栏一排软件开启的,浏览器中无数个标签打开的,重启代价太大,而且这个问题就像个地雷,指不定以后啥时候还会在遇到,于是决定以excludedportrange
为搜索关键词继续查找。
终于,在Stack Overflow的兄弟网站StackExchange/superuser看到了希望。继续尝试看到的指令的指令(先停止掉NAT服务,然后再开启):
net stop winnat
netsh interface ipv4 show excludedportrange protocol=tcp
net start winnat
netsh interface ipv4 show excludedportrange protocol=tcp
咦~好像OK了(判断依据: 13501
已经不在排除端口范围之内了),再次运行我的ASP.NET Core的项目,正常监听,再(多此一举)看下端口监听:netstat -ano | findstr 13501
一切正常,问题解决。
参考
- Kestrel unable to start
- Unable to start Kestrel getting 'An attempt was made to access a socket in a way forbidden by its access permissions'
- Many excludedportranges how to delete - hyper-v is disabled
- Unable to bind ports: Docker-for-Windows & Hyper-V excluding but not using important port ranges #3171
优秀 👍
实测有效
感谢~~
感谢,真有用折腾了一上午,都说端口占用,cmd查也没端口占用啊,还是你这个管用,对了我是在Google上搜到你的回答