gpt4 book ai didi

c - 在 C 中,我如何访问/迭代动态添加到 fd_set 的文件描述符?

转载 作者:太空宇宙 更新时间:2023-11-04 10:08:30 26 4
gpt4 key购买 nike

我正在尝试使用 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() 管道的多进程,但我找不到足够的信息来说明如何正确地实现它。

最佳答案

在 C 中,您可以使用宏 FD_ISSET 来查明给定的位是否已设置。查看manual page for select(2)了解详情。

基本思想是首先使用 FD_ZERO 将集合归零,然后使用 FD_SET 设置一些位,然后调用 select()(或 pselect(),根据喜好)。当 select() 返回时,您将迭代该集合并使用 FD_ISSET 来确定您是否可以对指定的描述符执行非阻塞 I/O 操作。

网上有很多例子;例如,an example from IBM .

关于c - 在 C 中,我如何访问/迭代动态添加到 fd_set 的文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com