1

TCP サーバー (Socket - Linux - C) を作成します。3 つの質問があります。

1) ネットワーク (または接続) がダウンしているかどうかを知るために、オプションを使用しましたSO_KEEPALIVEか?

例えば:

int optval = 1;
socklen_t optlen = sizeof(optval); 

if (setsockopt(file_descriptor,SOL_SOCKET,SO_KEEPALIVE,&optval,optlen)<0) {    
Close(file_descriptor);
Print_error("setsockopt() failed");

2) 自分のサーバーが他のサーバーに接続するようにしたい。リモートサーバーがシャットダウンしたかどうかをサーバーが知る方法は?

3)並行サーバーを作成したいので、fork()子を作成するために使用します:

3.1) 読み取り専用であっても、共有変数への同時アクセスを処理する必要がありますか?

3.2) プロセス リストにゾンビが表示されない...このコードは正しいでしょうか?

void sigchld_h (int signum);

int main(int argc, char *argv[]){
...;
}

void sigchld_h (int signum){
    pid_t pid;
    int status;
    while ( (pid = waitpid(-1,&status,WNOHANG)) > 0)
        printf("(%s) INFO - child %d terminated with exit status %d", nome_programma, pid, status);
}

ご相談ありがとうございました。

4

2 に答える 2

3

ネットワーク (または接続) がダウンしているかどうかを知るために、オプション SO_KEEPALIVE を使用しましたか?

出来るよ。あるいは、TCP/IP の上に独自の「ハートビート」メカニズムを実装することもできます。

私のサーバーが他のサーバーに接続することを望みます。リモートサーバーがシャットダウンしたかどうかをサーバーが知る方法は?

サーバーは別のサーバーに接続できません。つなぐのはクライアントです。受け入れるのはサーバーです。とにかく、ハートビート メカニズムを使用してエラーを処理し、サーバーがいつ (予期せず) ダウンしたかを判断する必要があります。

並行サーバーを作成したいので、子を作成するために fork() を使用します

これは、ほぼすべてのケースで最悪の考えです。これを行う最善の方法は、かなり少ない数のスレッドで非同期 I/Oを使用することです。

読み取り専用であっても、共有変数への同時アクセスを処理する必要がありますか?

を使用する場合fork()、各プロセスは変数を含む独自のメモリのコピーを受け取るため、同期は必要ありません。スレッドの場合、読み取り専用メモリにアクセスするときにロックする必要はありません。

プロセス リストにゾンビが表示されない...このコードは正しいでしょうか?

printf()いいえ、シグナルハンドラから呼び出すことはできません。async/reentrance safe 関数のみが許可されます。

于 2013-06-14T13:17:30.960 に答える