遇到的一个网络编程的bug
之前遇到一个bug,一直想不通为什么会出现。具体现象是程序一直尝试去连接一个没打开的端口,过一段时间,可能是几分钟,也可能是几天,那个端口突然被程序自己打开并连上了,然后读到了一些计划外的东西接着断言失败了。我仔细检查过整个程序的代码,有哪些可能会打开一个新的端口,结果没有发现。后来用gdb挂上跑,在listen,bind之类的函数打断点,也没见hit,但bug仍然出现了。
后来在同事的帮助下,发现因为我的程序一直在尝试去连接那个没打开的端口,一旦连不上,会重新再创建一个socket再重复尝试,这时从netstat工具可以看出,每次创建的socket系统会随机分配一个本地的端口,而那个端口号说是随机其实常常是依次递增,刚好我要连的那个没打开的端口也是本地的,于是刚好系统随机分配了那个端口号,结果就出现这种bug了。