Golang 报错端口不可用

211 阅读1分钟

在本地测试项目代码时,突然报错:

bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

项目代码没有问题,但是报错端口被占用

原因

系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数(源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、tcp输入/输出队列、应用层输出队列、tcp的重传有关变量等)

而tcb控制块并不是断开TCP连接后直接释放,而是要等待TCP连接time_wait时间之后再释放。因此当我们短时间频繁的启动退出操作后,系统可用的tcp连接数被用尽,且之前断开的tcp还没到time_wait时间没有得到释放,就会报错端口被占用

解决方法

1.终端查询占用端口的进程内容

netstat -aon|findstr "使用端口号"  例:netstat -aon|findstr "8080"

2.终止查到的进程PID

taskkill -F -PID 进程号   例:taskkill -F -PID 21064

然后再启动项目发现能够正常运行了