某程序(K) pkill 后靠后台程序自动吊起,发现对接程序未能连接,报 connect refused。
使用 netstat -apn | grep K 查看 K 监听的端口,发现 K 监听的端口并不是预期设计的端口。
查看代码,K 在收到 pkill 的信号(SIGTERM 15)后,直接退出主循环,未对正在处理的连接做 close 操作。
K 在重启后未对 socket bind 函数做返回值判断
//伪代码如:
int getSock(short port)
{
int s = socket(); //参数忽略了
sockaddr_in addrS;
initSockaddr(addrS, port); //此函数理解对 addrS 进行初始化,以端口 port
bind(s, (sockaddr*)&addrS, sizeof(sockaddr));
return s
}
此函数未对 socket 返回值进行判断,有时候系统可能分配不了 socket,最重要的是 bind 函数未进行返回值判断,port 此时可能是被占用,这样 bind 应该返回 -1。
pkill K 后,立刻 netstat -apn | grep port
可以看到此 port 的状态是: TIME_WAIT,此时 bind 应该不成功,但因未对 bind 返回值判断,return 的 s 实际监听的端口非 port。导致对端程序连接报 connect refused。