我用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);
}
}
}
答案 0 :(得分:1)
如果您想同时从多个客户端发送和接收 - 至少在接收端 - 您将需要使用线程,因为您的所有客户端都无法立即将数据发送到您的服务器,并且每个客户端的数据包都需要单独处理。 (我假设在“read_option”中收到的数据超过几个字节并且处理时间超过几微秒 - 如果这个假设是假的,那么你可能能够做你目前正在做的事情 - 但是我我很确定使用线程解决它更容易。显然,如果您有足够数量的客户端,您可能仍然没有足够的CPU或网络带宽来在一定时间内处理所有数据包。
有可能使用多播同时发送给所有客户端 - 但您无法保证所有客户端同时接收数据, - 当然,如果我们同时讨论计算机时间,则无法保证。如果客户端与服务器位于同一网络上,并且如果我们正在谈论人类的反应时间(0.05-0.1s),那么也许你可以实现这一点。如果机器分布在整个互联网上,你应该乐意达到0.1-0.5秒 - 而且可能更糟糕。
所以,鉴于评论:
由于您在send()
中正在执行receive()
和read_option()
,因此您的read_option将在此时阻止,因此不会处理任何其他客户端。
您将基本上需要使用pthread_create()
为每个客户端启动一个线程。然后,您可以在服务器和每个客户端之间相互独立地“聊天”。我希望你还需要在每个线程之间进行某种同步,这样它们就不会在彼此之前运行,或者某些运行。既然我不知道你在玩什么游戏,我不确定“游戏规则”应该是什么,并且不能真正评论 - 事实上,我认为这是另一个问题的一个很好的主题,而不是而不是在这个问题上[否则,我会担心它永远不会结束!]