debug小游戏服务器的一次经历

 大作业想实现棋类游戏的联机双人对战。由于想让两个玩家的地位是对等的,最终实现方案是客户端可在在任何一台Windows电脑上运行,服务器在阿里云一直跑。经过几天的努力我觉得服务器已经很完备,于是nohup,然后去忙别的(划水)。
 可过了两天我发现服务器进程断了,而且没有任何报错。每次重启的前几分钟一切正常!正常情况下程序不可能正常退出,而exit的位置我都调用了perror,所以我觉得自己程序没问题,是nohup指令使用有错误。去网上查资料,看到一些解决办法,比如输入nohup指令后回车,再exit退出ssh。但试了几次依然会有类似的情况。
 今天我例行公事挂上后检查,这回程序运行一段就出现异常了!我不得不放弃侥幸心理去看程序有什么漏洞。最后发现服务器有个本该退出循环的地方没有break,客户端的输入也存在锁死的可能。现在服务器挂了两个多小时还正常,问题是否解决还需进一步观察。
 刚做出这个东西时很自豪,于是就有些飘了,这也算是一个教训,服务器这种长时间运行的东西很容易有bug。虽然还是没明白进程为何会无报错终止……不管了有问题明天再说。


6.26更新

 第二天醒来服务器又崩了。由于要和父母去爬山把服务器重启就匆匆出门,一次连接也没有进行。下午回来查发现又断了,但这次居然也有输出,明明没人连接啊?于是发现一个大问题。
 问题在于我accept函数后两个参数使用的NULL。查询后发现,这种情况下accept可能是非阻塞的!!!这我以前倒还真不清楚,涨见识了。至于问题是否得到解决,还要接着观察……
 基本可以确定无报错退出原因。accept函数非阻塞,在close(confd)时直接退出。

6.28再更

 似乎不是这个原因,网上的方法不管用,accept函数每过几小时还莫名奇妙的非阻塞,实在是太气人了!!!!!!我不想再纠结这个问题,直接在接受信息处理中加入非法输入关闭端口重新开始循环。这回应该可以长时间运行了吧……
 至于恰巧两个accept一个不知连到了哪另一个被用户连上的情况,我只能说概率太小不予考虑。而且即使遇到这个问题退出重启就可以解决,就这样吧。

7.1

 我似乎犯了一个十分脑残的错误。nohup默认是将标准输出流重定向到nohup.out,但程序报错是标准错误流啊啊啊啊。所以应该是

nohup ./server >log 2>&1 &

这样报错信息才能保存在文件里。


参考:nohup 输出重定向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值