所以我编写了这个通过send()和recv()相互通信的服务器/客户端应用程序。它是用C语言编写的。服务器可以通过线程处理多个连接。我有一个Ping函数,如果客户端还活着,它会每90秒检查一次。现在我的问题是,如果其中一个客户端崩溃,服务器端的CPU立即使用100%。这是我的while while循环,等待客户端的传入命令,如果正在发送字符串结束则结束。但是如果客户端崩溃,那么就没有结束字符串,我认为它会在这个循环中继续旋转。
do
{
TCP_recv (&client, buffer, BUF-1);
if (!strcmp(buffer,"mysql"))
{
TCP_recv (&client, buffer, BUF-1);
mysql_real_query(my, buffer, strlen(buffer));
syslog(LOG_INFO,"%s",buffer);
TCP_send (&client, "Server got the MySQL string!", BUF-1);
}
}
while (strcmp(buffer,"end"));
有没有人知道服务器如何立即做出反应而不是循环死亡?
PS:如果我的kill-all-clients-who-not-respond函数启动并关闭套接字,CPU使用率会立即恢复正常。
答案 0 :(得分:0)
通常在使用select()时会发生这种情况,并且客户端已断开连接/崩溃,并且您没有从正在检查的插槽FD中删除套接字FD。这个结果是它将连续迭代while循环而不会阻塞send()/ recv()。通过检查recv()和/或send()的返回来检查您是否尝试从崩溃的客户端接收。