こんにちは、私は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)
とにかく助けてくれてありがとう