0

所以我编写了这个服务器/客户端应用程序,它们通过 send() 和 recv() 相互通信。它是用 C 编写的。服务器可以通过线程处理多个连接。我有一个 Ping 功能,每 90 秒检查一次客户端是否还活着。现在我的问题是,如果其中一个客户端崩溃,服务器端的 CPU 会立即使用 100%。这是我的 do while 循环,它等待客户端的传入命令,如果正在发送字符串 end 则结束。但是,如果客户端崩溃,则没有结束字符串出现,我认为它会在这个循环中不断旋转。

    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 使用率会立即恢复正常。

4

1 回答 1

0

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

于 2012-09-26T07:50:04.323 回答