2

それぞれクライアント アプリケーションでソケットを開いている複数のスレッドがあります。これらの各スレッドは、メイン スレッドからクライアントにコマンドを送信する命令を受け取ります (コマンドは、テストの実行、テストの停止、セッションの終了、終了などです)。これらのスレッドは一般的なもので、クライアントごとにソケットがあり、メインスレッドが要求したときにコマンドを送信するだけです。

クライアントが終了またはクラッシュするか、ネットワークが不良である可能性があります。

TCP セッションがクライアントごとに終了したことを確認する方法を確認しようとしています。ここで適切と思われる 2 つの解決策を見つけました。

1) 独自のハートビート システムを実装する 2) setsockopt を使用して keepAlive を使用する。

私は 2) を実装する方が速いように聞こえるので試しましたが、1 つ確信が持てません: 接続が中断された場合、SO_KEEPALIVE は SIGPIPE を生成しますか? そうあるべきだと思いましたが、SIGPIPE を受け取ったことはありません。

これは私のコードがどのように見えるかです:

void setKeepAlive(int sockfd) {
    int optval;

    optval = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, &optval, sizeof(optval));
    optval = 1;
    setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, &optval, sizeof(optval));
}

接続を受け入れる私のコードは次のとおりです。

for (mNumberConnectedClients = 0; mNumberConnectedClients < maxConnections; ++mNumberConnectedClients) {
    clientSocket = accept(sockfd, (struct sockaddr *) &client_addr, &clientLength);

    // set KeepAlive on socket
    setKeepAlive(clientSocket);

    pthread_create(&mThread_pool[mNumberConnectedClients], NULL, controlClient, (void*) &clientSocket);
}

signal(SIGPIPE, test);
....

そしてテスト機能:

void test(int n) {
    printf("Socket broken: %d\n", n);
}

test() はトリガーされません。間違っているのは私の理解ですか?SIGPIPE が生成されるかどうかはわかりません。どうもありがとう。

4

1 に答える 1