具有多个客户端C代码的TCP服务器

时间:2012-12-28 12:01:50

标签: c

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

1 个答案:

答案 0 :(得分:1)

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

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

所以,鉴于评论:

由于您在send()中正在执行receive()read_option(),因此您的read_option将在此时阻止,因此不会处理任何其他客户端。

您将基本上需要使用pthread_create()为每个客户端启动一个线程。然后,您可以在服务器和每个客户端之间相互独立地“聊天”。我希望你还需要在每个线程之间进行某种同步,这样它们就不会在彼此之前运行,或者某些运行。既然我不知道你在玩什么游戏,我不确定“游戏规则”应该是什么,并且不能真正评论 - 事实上,我认为这是另一个问题的一个很好的主题,而不是而不是在这个问题上[否则,我会担心它永远不会结束!]