大作业想实现棋类游戏的联机双人对战。由于想让两个玩家的地位是对等的,最终实现方案是客户端可在在任何一台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 输出重定向