そこで、send() と recv() を介して相互に通信するこのサーバー/クライアント アプリケーションを作成しました。C で書かれています。サーバーは、スレッドを介して複数の接続を処理できます。クライアントがまだ生きているかどうかを 90 秒ごとにチェックする Ping 関数があります。ここでの問題は、クライアントの 1 つがクラッシュすると、サーバー側の CPU が即座に 100% 使用されることです。これは、クライアントの受信コマンドを待機し、文字列 end が送信されている場合に終了する do 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 使用率は即座に通常に戻ります。