1

こんにちは、私はCでマルチスレッドサーバー(TCP)に取り組んでいますが、少し問題があります。すべてが正常に機能し、複数のスレッドがサーバーに接続できますが、クライアントが「exit」(「exit」文字列を書き込むときのクライアントの条件)を書き込むと、シャットダウンが実行されます。それ自体も。そのため、他のスレッドを介した通信が失われます。ただし、論理的には、現在のクライアントの一部が切断された場合でも、他のクライアントを待機する必要があります。これがメインの一部であり、サーバーは待機中のクライアントのために無限のループにあります。hsockソケットのIDはサーバーに属し、csockはクライアントのIDです。

main(){
.
.
.


while(1){

    if(counter==0)
        printf("waiting for a connection\n");

    csock = (int*)malloc(sizeof(int));

    if((*csock = accept( hsock, (struct sockaddr*)&sadr, &addr_size))!= -1){
    printf("---------------------\nReceived connection from %s\n",inet_ntoa(sadr.sin_addr));
        pthread_create(&thread_id,0,&SocketHandler, (void*)csock );
        counter++;
    }

    else{
     fprintf(stderr, "Error accepting %d\n", errno);
    }
        }// end while
.
.
.
return 0
}

クライアントが切断されるたびにわかるように、サーバーは別のスレッドを待機し続ける必要があります。一方、これはSocketHandlerスレッド関数である関数の最後の部分です。

void* SocketHandler(void* csock){
.
.
.

        printf("Client disconnected\n");
        free(csock);
        return 0;
    }

アフターステートメントは、メインのループにreturn 0戻る必要はありません。while(1)とにかく助けてくれてありがとう

4

2 に答える 2

1

スレッドは、作成されると非同期で実行されます。つまり、メインスレッド(を実行しているスレッドaccept)はループを継続し、子スレッドが何を実行しても、新しい接続の受け入れに戻る必要があります。

いくつかのアドバイス:

  • スレッドが自律的に実行できる場合pthread_detachは、作成後に使用して、スレッドが自身の終了を適切に処理できるようにします。
  • close(csock)スレッドを終了する前に行うことを忘れないでください。
  • 必ずしもソケット記述子を含むintを割り当てる必要はなく、void *直接渡すだけです(ただし、将来のバージョンのコードでは、構造体のソケットだけでなく、より多くの情報を渡すことになると思います)。
于 2012-11-09T18:57:05.570 に答える
0

return 0ステートメントの後、mainのwhile(1)ループに戻る必要はありません。

いいえ。スレッドは終了します。他のスレッドで何が起こるかとは何の関係もありません。

クライアントにネットワークを処理するコードを表示しない場合に、クライアントの切断時に発生するネットワークの問題について、誰かがどのように役立つと期待できるかわかりません。

于 2012-11-09T20:57:07.797 に答える