address-already-in-use


上周遇到个熟悉的问题Address already in use: bind,本来以为是个简单的端口占用问题,没想到花了很长时间才解决,避免以后再次入坑,特此记录。

常规端口占用

windows

netstat -ano|findstr ${端口号} #查找端口
taskkill /f /pid ${端口号} #杀死进程

Linux & Mac

lsof -i:${端口号}
kill -9 ${端口号}

Hyper-V保留端口

这次遇到端口占用问题,是在笔记本被强制更新之后遇到的(Windows10系统),用了上述的方法怎么也不好使,有人说用管理员执行netsh winsock reset,然后机器重启就行了。可是我执行后重启了5,6次,程序依然还是报Address already in use: bind。这时候我就比较迷惑了,一般说程序员3大法宝:重启程序重启电脑重装系统,没有什么是解决不了的。因为是公司电脑,重装系统是不可能的了。重启程序和电脑我试了不下10遍,问题依然存在,这时候人就比较慌了。

后来上Github搜索可能是Hyper-V的问题,按照issue: Unable to bind ports的方式查看发现我程序的启动端口在Hyper-V的保留端口的范围之内,于是乎虽然端口没被占用,但是程序依然会报Address already in use: bind。于是把Hyper-V卸了,重启电脑问题解决。

查找Hyper-V保留端口范围

cmd执行

netsh interface ipv4 show excludedportrange protocol=tcp

返回

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     49692       49791
     49792       49891
     49892       49991
     49992       50091
     50092       50191
     50214       50313
     50498       50597

* - Administered port exclusions.

issue提供的解决方法

  1. 禁用Hyper-V(需要2次重启)

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

  1. 重启结束之后,保留你想要的端口使Hyper-V无法占用该端口

netsh int ipv4 add excludedportrange protocol=tcp startport=50051 numberofports=1

  1. 重启Hyper-V(还是需要重启)

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

然后你就会发现程序可以正常的启动了

因为我用不到Hyper-V,所以直接卸载了Hyper-V

事后感叹:Windows更新真的很坑呀!!!


文章作者: iamazy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamazy !
 上一篇
锦瑟 锦瑟
锦瑟锦瑟无端五十弦一弦一柱思华年庄生晓梦迷蝴蝶望帝春心托杜鹃沧海月明珠有泪蓝田日暖玉生烟此情可待成追忆只是当时已惘然 魅力意译美丽的古瑟不会无由的有五十根弦拨动这一根又一根的弦无限的愁思寄托在上面,追溯到从前遥想当年庄周入梦幻化为蝶
2020-09-17
下一篇 
Java虚拟机指令集 Java虚拟机指令集
aaload (50,0x32) 从数组中装载引用类型 1. 操作数栈 pop: arrayref,indexpush: value arrayref必须是引用类型R[],并且必须指向元素为引用类型R的数组。索引必须是int类型。a
2020-03-22
  目录