bug

sscap 关闭之后再次打开提示端口占用

Posted by kele on October 10, 2018

sscap 关闭之后再次打开提示端口占用

这篇文章只是分析一下这个问题的原因,并没有真正的解决!! sscap 作为shadowsocks的替代品可以说是非常棒的,可以批量导入大量的节点,然后批量ping检测,找出能用的节点,假如找到免费的大量ssr节点,用起来超级爽,但是也有好多问题,其中一个问题就是sscap 关闭之后再次打开有时候会提示端口占用。

经常有那么几次,关闭之后,再次打开就会提示端口占用,可是没有什么端口使用1080了啊?于是我打开 process hacker 2,发现有几个连接处于 waiting connection 的状态,于是就等啊等,一直等到这几个连接从等待状态彻底关闭。今天看《python 网络编程》突然看到一段话,瞬间想到这个问题。

tcp 的关闭是四次握手,但是最后一次握手是否能够正常发送到对面呢?这个是无法保证的。比如说

上图中的最后一个ACK包从A发送到B,如何确保B收到呢?假如使B接收到最后一个ACK包时,再回复A一个数据包,那么有怎样确保A能收到这个数据包呢?这样就变成了一种死循环。所以说tcp 的关闭其实并不是绝对可靠的。因此在应用程序关闭套接字之后,操作系统会接手这些套接字,修改他们的状态为“等待”,这个状态持续大约4分钟,或短或长,之后操作系统才会真的关闭他们。

编程时注意

c 中的 socket 有这个一个函数 setsockopt 可以修改一个叫做 SO_REUSEADDR 的参数,开启之后,就可以是强制使用这些被应用程序关闭的,但被操作系统置为等待状态的套接字了。

ps:本来想在sscap的socket bind位置 设置SO_REUSEADDR,但是工程编译不起来,errors 太多,遂放弃之,加上这个项目如果开发了会被请去喝茶,于是凑付用吧。