【问题标题】:TCP server with multiple clients C code具有多个客户端的 TCP 服务器 C 代码
【发布时间】:2012-12-29 04:39:20
【问题描述】:

我用 C 代码编写了一个 TCP 服务器应用程序,它可以同时处理多个客户端连接。当服务器从一个客户端接收数据时,所有客户端都应该收到它。 我使用 select() 来创建服务器和多个客户端之间的连接,但我不知道如何让所有客户端同时接收相同的数据,并且每个客户端都能够将数据发送到服务器。

read_option(fd) 是我在应用程序中使用的函数

while(1)
{
    select (nfds+1, &readfds, NULL, NULL, &tv);
    if (FD_ISSET (sd, &readfds))
    {
        len = sizeof (from);
        bzero (&from, sizeof (from));
        client = accept (sd, (struct sockaddr *) &from, &len);
        if (client < 0)
        {
            continue;
        }
        if (nfds < client) 
            nfds = client;
        FD_SET (client, &actfds);
        fflush (stdout);
    }
    for (fd = 0; fd <= nfds; fd++)  
    {
        if (fd != sd && FD_ISSET (fd, &readfds))
        {
            if (read_option(fd))
            {
                fflush (stdout);
                close (fd);
                FD_CLR (fd, &actfds);
            }
        }
    }

【问题讨论】:

  • 你必须考虑一种叫做多播的东西,但你必须小心。如果您不喜欢这样,那么您可以简单地实现一些更天真的东西,服务器将向每个客户端发送它收到的任何内容。这意味着,您将客户端 IP 存储在地图或数组中。

标签: c


【解决方案1】:

如果您想同时从多个客户端发送和接收 - 至少对于接收端 - 您将需要使用线程,因为您的所有客户端无法同时向您的服务器发送数据,并且每个客户端的数据包都需要单独处理。 (我假设在“read_option”中接收到的数据超过几个字节并且需要超过几微秒来处理 - 如果这个假设是错误的,那么你可能能够做你目前正在做的事情 - 但我'我很确定使用线程解决它更容易)。显然,同样,如果您有足够数量的客户端,您可能仍然没有足够的 CPU 或网络带宽来在设定的时间内处理所有数据包。

可以使用多播同时向所有客户端发送数据 - 但您不能保证所有客户端同时接收数据 - 如果我们同时谈论计算机时间,当然不能。如果客户端与服务器位于同一网络上,并且我们谈论的是人类反应时间(0.05-0.1s),那么也许您可以实现这一点。如果机器分布在整个互联网上,你应该很高兴达到 0.1-0.5 秒——而且很可能更糟。

所以,给定 cmets:

因为您在read_option() 中执行send()receive(),所以此时您的read_option 将阻塞,因此不会处理任何其他客户端。

您基本上需要使用pthread_create() 为每个客户端启动一个线程。然后,您可以在服务器和每个客户端之间相互独立地“聊天”。我希望您还需要在每个线程之间进行某种同步,这样它们就不会彼此领先,或者类似的。由于我不知道您在玩什么游戏,因此我不确定“游戏规则”应该是什么,也无法对此发表评论-实际上,我认为这是另一个问题的好主题,而不是比这个问题[否则,我担心它永远不会结束!]

【讨论】:

  • 如何使用线程?我的应用程序只需要两个客户端(它是关于一个游戏,每个玩家都应该看到桌面游戏和其他玩家的动作。游戏是在那个函数“read_option”中实现的)
  • 两个玩家,假设你不下国际象棋之类的,我会说只是做你现在正在做的事情。
  • 但是如果你想使用线程,例如查找“pthreads”。
  • 此时只有第一个开始游戏的客户端能够与服务器通信(接收发送数据和应用程序工作“正常”,因为第一个客户端可以玩,因为有 2 个玩家) ,而第二个客户端只收到主菜单游戏,也看不到第一个客户端所做的操作。
  • 您确定要在循环中间发送close (fd); 吗?并不是说这就是事情出错的原因,但它可能是......除此之外,我认为我们需要看看 read_option 做了什么。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多