【问题标题】:Close thread when waiting for data in recv等待recv中的数据时关闭线程
【发布时间】:2023-03-08 17:23:01
【问题描述】:

我有一个服务器,它为每个客户端创建一个线程。这是线程函数,我的程序在其中等待发送数据。如果 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");
  }

....
}

【问题讨论】:

  • 不确定你到底要做什么,但听起来你想为客户端打开一个线程,等待5秒,如果客户端没有发送数据则关闭它那时。对吗?
  • 是的 :)。我该怎么做?
  • 您有什么理由决定使用 SIGALRM 方法吗?为什么不在你的线程中只sleep(5) 在进行接收呼叫之前?是不是因为 recv 阻塞了?
  • 我会使用 select 超时 5 秒,如果 select 指示套接字上有数据等待,则仅尝试 recv
  • 也可以只关闭主线程中的套接字。这将结束阻塞 recv 将返回 WSAEINTR。这样,无响应客户端的线程将终止。

标签: c++ c multithreading recv


【解决方案1】:

听起来你应该打开线程,等待 5 秒,然后检查 sClient 是否有数据。如果没有数据,则可以立即关闭线程。否则,如果有数据,你可以调用recv来实际获取数据。

为此,您可以使用带有超时的select 调用来检查套接字上的新数据。

(请参阅“socket timeout: It works, but why and how, mainly the select() function?”了解 select 的超时工作原理。)

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2015-02-15
    • 2012-11-29
    • 2021-10-03
    • 2010-11-23
    相关资源
    最近更新 更多