0

そこで、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 使用率は即座に通常に戻ります。

4

1 に答える 1

0

通常、これは select() を使用していて、クライアントが切断/クラッシュし、チェック対象からソケット FD を削除しなかった場合に発生します。この結果、send()/recv() でブロックすることなく、while ループを継続的に反復します。recv() および/または send() からの戻りをチェックして、クラッシュしたクライアントから受信しようとしていないことを確認します。

于 2012-09-26T07:50:04.323 に答える