我正在为我的iOS游戏编写服务器后端。服务器是用C ++编写的,并且已经编译好了。在删除Ubuntu服务器上运行。我使用
通过SSH启动服务器sudo nohup ./mygameserver& amp;
服务器通信是用TCP编写的。读循环的主要功能是使用标准C socket.h / netdb.h / in.h编写的,并使用select()接受非阻塞侦听套接字上的许多用户。
当我通过SSH在前台运行服务器时,一切似乎都运行正常。它接收我按正确顺序发送的所有数据包,并使用正确的标头信息。当我使用nohup并断开与SSH的连接时......一切似乎都崩溃了。当服务器软件在没有SSH / nohup模式的情况下运行时,用户连接的典型日志如下所示:
CONNECTED TO SQL
Server starting...
Second thread initialized
Entering order loop
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
<this line continues ad infinitum>
我真的不知道为什么。我确保每个打印都转到nohup.out而不是std :: cout,服务器每隔10秒向MySQL发送一次更新,以避免超时。
关于这里有什么问题的任何想法或意见?如果您想要一些代码示例,请告诉我,我只是不知道哪个特别对这个问题感兴趣。提前谢谢。
答案 0 :(得分:0)
我发现了什么问题。
在我的服务器程序中,我有一个readSockets()函数,在主服务器循环中调用select()之后调用它。 readSockets()函数响应在启动时由nohup推送到stdin的新行字符(由于我不知道的原因),并且因为stdin实际上也是连接到文件描述符的FILE *,我的readSockets()函数响应stdin作为连接客户端。
这显然使服务器崩溃,因为stdin从未被刷新(因此每次select()返回时都会读取)。这再次阻止了其他用户的线程。