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

具有多个客户端的TCP服务器C代码,c,C,我用C代码编写了一个TCP服务器应用程序,可以同时处理多个客户端连接。当服务器从一个客户端接收数据时,所有客户端都应该接收数据。 我使用select()在服务器和多个客户端之间创建连接,但我不知道如何使所有客户端同时接收相同的数据,并且每个客户端都能够向服务器发送数据 read_option(fd)是我在应用程序中使用的函数 while(1) { select (nfds+1, &readfds, NULL, NULL, &tv); if (FD_ISSET (s

我用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);
            }
        }
    }
while(1)
{
选择(nfds+1、&readfds、NULL、NULL和tv);
if(FD_ISSET(sd和readfds))
{
len=sizeof(从);
bzero(&from,sizeof(from));
client=accept(sd,(struct sockaddr*)和from,&len);
如果(客户端<0)
{
继续;
}
如果(nfds<客户端)
nfds=客户;
FD_集(客户端和actfds);
fflush(stdout);
}

对于(fd=0;fd如果您希望同时从多个客户端发送和接收数据,至少对于接收端而言,您需要使用线程,因为您的所有客户端无法同时向服务器发送数据,并且每个客户端的数据包都需要单独处理。(我假设在“read\u选项”中接收的数据)超过几个字节,处理时间也超过几微秒——如果这个假设是错误的,那么您可能能够完成当前正在做的事情——但我非常确定,使用线程解决它更容易。)。显然,同样,如果您有足够数量的客户端,您可能仍然没有足够的CPU或网络带宽在设定的时间内处理所有数据包

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

因此,鉴于评论:

因为您正在
read\u option()
中执行
send()
receive()
,您的read\u选项将在该点阻塞,因此不会处理任何其他客户端


您基本上需要使用
pthread\u create()
为每个客户端启动一个线程。然后您可以“聊天”服务器和每个客户端之间相互独立。我希望每个线程之间也需要某种同步,这样它们就不会先于其他线程运行。因为我不知道你在玩什么游戏,所以我不确定“游戏规则”是什么应该是,但不能对此发表评论——事实上,我认为这是另一个问题的一个很好的主题,而不是在这个问题上[否则,我担心它永远不会结束!]

如果您想同时从多个客户端发送和接收数据(至少对于接收端而言),您需要使用线程,因为不可能所有客户端都能同时向服务器发送数据,而且每个客户端的数据包都需要单独处理。(我假设在“读取”选项中接收的数据)超过几个字节,处理时间也超过几微秒——如果这个假设是错误的,那么您可能能够完成当前正在做的事情——但我非常确定,使用线程解决它更容易。)。显然,同样,如果您有足够数量的客户端,您可能仍然没有足够的CPU或网络带宽在设定的时间内处理所有数据包

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

因此,鉴于评论:

因为您正在
read\u option()
中执行
send()
receive()
,您的read\u选项将在该点阻塞,因此不会处理任何其他客户端


您基本上需要使用
pthread\u create()
为每个客户端启动一个线程。然后您可以“聊天”服务器和每个客户端之间相互独立。我希望每个线程之间也需要某种同步,这样它们就不会先于其他线程运行。因为我不知道你在玩什么游戏,所以我不确定“游戏规则”是什么应该是,但不能对此发表评论——事实上,我认为这是另一个问题的一个很好的主题,而不是在这个问题上[否则,我担心它永远不会结束!]

你必须考虑一个叫多播的东西,但是你必须小心。如果你不喜欢它,那么你可以简单地实现一些更幼稚的东西,服务器会把它所接收到的任何东西发送给每一个客户。这意味着你把你的客户IPs存储在一个地图或一个数组上。你必须考虑一个叫多播的东西,但是你必须小心。ful。如果你不喜欢,那么你可以简单地实现一些更简单的东西,服务器将向每个客户端发送它接收到的任何东西。这意味着,你将客户端IP存储在一个映射或数组上。我如何使用线程?我的应用程序只需要两个客户端(这是关于一个游戏,每个玩家都应该看到桌面游戏和另一个玩家的移动。这个游戏是在“read_option”函数中实现的)对于两个玩家,假设你不是在下棋或其他类似的游戏,我会说只做你现在正在做的事情是可以的。但是如果你想使用线程,可以查一下“pthreads”。