私は簡単なクライアント - サーバーチャットプログラムを作ろうとしています。クライアント側では、別のスレッドをスピンオフして、サーバからのデータを読み込みます。問題は、人がメインスレッドからログアウトしたときに、その2番目のスレッドを正常に終了させたいということです。私は共有変数 'を使用して終了しようとしていた問題は、ソケットの読み取り()コマンドはブロックコマンドですので、(実行== 1)、サーバーは何かを返す前に送信する必要がありますwhile条件を再度確認することができます。私はノンブロッキングの読み込みを行うためのメソッド(一般的なunixソケットのみ)を探しています。基本的にはpeek()のいくつかの形式が動作します。C - Unixソケット - 非ブロック読み取り
読み込みスレッドのループは以下の通りですが、今は共有変数にはミューテックスがありませんが、後で追加する予定です。 ;)
void *serverlisten(void *vargp)
{
while(running == 1)
{
read(socket, readbuffer, sizeof(readbuffer));
printf("CLIENT RECIEVED: %s\n", readbuffer);
}
pthread_exit(NULL);
}
このコンテキストでは、sd + 1の意味は何ですか?私はこのように走ったが、それはうまくいったが、20时间のようにループをループし、新しい入力が作成されるまで停止したが、私が望むように優雅に終了した。タイムアウトなどの間に実行していたのとほとんど同じです – will
端末に「man select」と入力すると、選択機能の詳細な説明が表示されます。最初の引数selctは値記述子に1を加えた値が最大になります。ここでは1つの記述子しかないので、私は(sd + 1)と書くだけです。 – fghj
約20回のメモを理解できません。あなたの最初の質問のコンテキストで私のコードは、次のように動作する必要があります:1)チェックフラグ(終了する時間?)2)入力またはタイムアウトまでスリープ状態3)何かを読んで4)goto(1)。だから、少し遅れて出る。しかし、あなたは状況を処理する必要があります他の側の近くの接続、あなたに戻ってコントロールを選択するが、 "読み取り" 0バイトを読み取ると、ビジーループを取得します。ですから、 "read"の結果をチェックし、ゼロの場合はループを終了する必要があります。 – fghj