如果客户端崩溃,服务器立即使用100%的CPU

时间:2012-09-26 07:47:08

标签: c multithreading sockets cpu-usage recv

所以我编写了这个通过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使用率会立即恢复正常。

1 个答案:

答案 0 :(得分:0)

通常在使用select()时会发生这种情况,并且客户端已断开连接/崩溃,并且您没有从正在检查的插槽FD中删除套接字FD。这个结果是它将连续迭代while循环而不会阻塞send()/ recv()。通过检查recv()和/或send()的返回来检查您是否尝试从崩溃的客户端接收。