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 回答