0

すべてのクライアントに対してスレッドを作成するサーバーがあります。これは、プログラムがデータの送信を待機するスレッド関数です。5 秒以内にデータが送信されない場合は、どうにかしてこのスレッドを閉じる必要があります。私はその信号/アラームの組み合わせで試してみましたが、何とか動作しますが、sClient(socket) が閉じているため、残りのスレッド関数はエラーを出力し続けています。どうすればこれを機能させることができますか、または他の解決策はありますか?

void time_out() {
  char r = "-1";
  printf("Time out");
  send(sClient, &r, 10, 0);
  close(sClient);
}

void* thread(void *arg) {
  sClient = (int)arg;
  int size;

  char* buffer = (char*)malloc(300);

  signal(SIGALRM, time_out);
  alarm(5);

  if (recv(sClient, (char*)&size, sizeof(int), 0) < 0) {
    printf("Error when getting length \n");
  }

....
}
4

1 に答える 1

3

スレッドを開いて 5 秒待ってから、sClient のデータを確認する必要があるようです。データがない場合は、すぐにスレッドを閉じることができます。それ以外の場合、データがある場合は、実際にデータを取得するために recv を呼び出すことができます。

これを行うにはselect、タイムアウトを指定して呼び出しを使用し、ソケット上の新しいデータをチェックします。

(タイムアウトの仕組みについては、「ソケット タイムアウト: 機能しますが、主に select() 関数がなぜ、どのように機能するのか?」を参照selectしてください。)

于 2013-03-30T11:53:15.430 に答える