【问题标题】:Block a client without blocking others in Select在 Select 中阻止客户端而不阻止其他客户端
【发布时间】:2015-09-10 09:07:17
【问题描述】:

我必须创建一个包含两部分的程序:客户端/服务器。

我从不同的客户端接收命令,我想让客户端在命令执行期间等待,但是,其他客户端必须能够向服务器发送命令

例如: C1(用于客户端 1)和 C2(用于客户端 2)

C1 发送命令 -> 服务器接收并执行它,他在 x 秒内无法接受来自 C1 的命令,但他可以接受来自 C2 的命令。

如何在没有线程的情况下使用 select 函数。

这是我当前来自服务器的代码:

void            client_ask(t_listplayer *list, t_network *net) {
  char          *buffer = xmalloc(sizeof(char) * 200);
  int           rd = 0;

  memset(buffer, 0, 200);
  while (list != NULL) {
      if (FD_ISSET(list->player->fd, &net->readfds)) {
          if ((rd = xread(list->player->fd, buffer, 200)) > 0) {
              buffer[rd - 1] = '\0';
              printf("Client n°: %d asking : [%s]\n", list->player->fd, buffer);
              sleep(3); // This one put all the server in waiting
              memset(buffer, 0, 200);
            } else {
              close(list->player->fd);
              printf("Client n°: %d has just disconnected", list->player->fd);
            }
        }
      list = list->next;
    }
}

所以,我做了很多研究.. 我听说过有关超时的事情,但我不知道该怎么做。 谢谢

【问题讨论】:

  • 分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案!另见how to ask
  • 是的,当然,对不起,我是新人..所以我放了一些代码来解释更多
  • 新人没关系 ;)
  • 我发誓我只要看看你的代码就知道你目前正在从事什么学校项目 XD。这闻起来像 Epitech 和 zappy 项目
  • 没有20个声望..

标签: c select client server


【解决方案1】:

您可以在客户端列表中管理客户端状态。如果客户端状态是“等待”,请不要回答(或者更好:回答“您必须等待 x”或一些有用的反馈)。所有客户端都可以发送请求,并且只有处于正确状态的客户端才会被处理。

当您的工作完成后,不要忘记重置客户端的状态。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2011-08-15
    • 2013-11-21
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多