鞭尸——记录一个低级失误,未对函数返回值做判断

某程序(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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值