2

私はTCPサーバーを書いています。TCPソケットとの間でテキストの読み取り/書き込みを行い、サーバーが実行されているファイルシステム上のテキストファイルとの間でこのテキストの読み取り/書き込みを行うだけです。

接続に問題がある場合(たとえば、クライアントがソケットを閉じる場合)、読み取り/書き込みでブロックされたサーバーはSIGPIPE信号を受信します。無視したいのですが、通信が不可能になったため、サーバーは単にソケットの端を閉じます。それは良い方法ですか?

私が考慮しなければならない他の信号はありますか?

4

3 に答える 3

4

多くのサーバープログラムは、を無視し、 /からSIGPIPEの戻りコードを使用して切断をよりよく理解することを選択します。たとえば、/は、もう一方の端から適切に切断された場合、および複数の選択肢の1つに設定された場合にエラーが発生した場合に戻ります。readwritereadrecv0-1errno

于 2012-06-07T10:13:35.580 に答える
1

サーバーがクラッシュした場合に備えて、割り込みハンドラーを実装して、閉じる前にいくつかの操作を実行することもできます。

例:SIGINT

void interrupt_handler(int sig){
    endloop = 1;
    close(sd);
    printf("Interrupt recieved: shutting down server!\n");
    return;
}

int main(int argc, char** argv){

    //all typical TCP socket functions

    signal(SIGINT, interrupt_handler);

    while(!endloop){

      //service loop

    }

}
于 2012-06-07T10:20:18.760 に答える
0

サーバーがデーモンプロセスである場合、サーバーのSIGHUP再起動または再初期化に使用するのが一般的な方法です。ただし、@ Joachimの答えが最も重要です。クライアントの動作によって、サーバーが終了することはありません。

注:非同期であるため、シグナルハンドラーが安全に実行できることには制限があります。

于 2012-06-07T11:41:37.450 に答える