【发布时间】:2018-05-30 16:54:11
【问题描述】:
我正在尝试使用 select() 和 fd_sets 在 Linux 中使用 C 实现服务器/多客户端程序。我正在尝试将从一个连接的客户端发送的消息广播到所有其他连接的客户端,但我不知道如何在动态添加后访问 fd_set 中其他客户端的套接字。我正在尝试复制我在 C++ 中找到的这个实现,但是 C 中的 fd_set 没有 C++ 的属性。这是我要复制的代码:
for(int i = 0; i < master.fd_count; i++)
{
SOCKET outSock = master.fd_array[i];
if(outSock != listening && outSock != sock)
{
send(outSock, buffer, 250);
}
}
其中master 是 fd_set,listening 是侦听新客户端的原始套接字,sock 是即将广播的消息来自的套接字。
谁能帮助我学习如何访问 fd_set 套接字元素,以便能够像示例中那样对它们进行!= 比较。或者,将我指向另一种方法来实现多客户端设置,我可以将消息广播回所有连接的客户端。我最初尝试使用带有fork() 管道的多进程,但我找不到有关如何正确实现它的足够信息。
【问题讨论】:
-
通常你应该在一个单独的数组中跟踪你添加到集合中的元素,然后对其进行迭代。您可以使用
FD_ISSET检查 fd 是否在集合中 -
不要使用
select。使用poll。无论如何,它更容易使用,并且前者存在基本的接口缺陷,使得在没有未定义行为和黑客攻击的情况下无法使用高 fd 数。