1

我用 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);
            }
        }
    }
4

1 回答 1

1

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

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

因此,鉴于评论:

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

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

于 2012-12-28T12:30:17.370 回答