关于端口占用问题
来源:4-7 案例实操-TCP基础数据传输-1
量能授官
2018-11-24
老师,我运行git仓库中第四章节的代码时,在server不关闭的情况下,第二次启动client会出现如下错误
查看tcp连接状态发现client使用的端口20001处于TIME_WAIT状态。百度后得到答案:win下默认TIME_WAIT 时间过长导致。
但是修改后发现新的问题,如果使用win默认配置,在server不关闭的情况下,连续两次启动client(使用20001端口)会报上图中的错误,但是使用新端口(20002)连续两次启动client就不会报错,其中20002端口也是处于TIME_WAIT状态。这就与之前的答案相悖。
所以我想问的是:为啥在server不关闭的情况下,第一遍连续两次启动client(端口20001)会报错,而第二遍连续两次启动client(端口20002)不会报错。
1回答
-
初步怀疑的是20001端口应该是有其他进程也有占用,一般来说这个问题可以通过设置是否复用端口来解决;当然对于帮的端口只能有一个进程进行。
所以需要等待上一个进程结束后下一个进程才能链接。
当Socket调用close后并不是就立即关闭了,一般来说还会进行一定的数据回收,以及资源的复用处理。此时开启新的链接时将会出现上述端口已被占用的问题。
一般情况下是换个端口,或者完全退出进程后可以解决,当然若端口是被咱们的进程占用的情况;如果是其他的程序进程那就不行了,那就需要换个端口了。
一般来说不会出现你上述所说的 20001与20002表现不同的情况的。怀疑还是有进程占用的原因,可以使用命令打印一下端口占用情况。
https://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html
112018-11-26