gpt4 book ai didi

c - 在服务器中使用 select() 处理新客户端的最佳方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:00 24 4
gpt4 key购买 nike

我想用 C 语言编写一个异步套接字服务器,但在此之前,我正在做一些研究。查看此处显示的 select() 套接字示例:http://www.gnu.org/s/hello/manual/libc/Server-Example.html#Server-Example我可以看到示例程序在每个选择循环中只接受一个客户端(如果我没看错的话)。因此,如果有 20 个客户端和另外两个尝试连接,它是否只接受第 21 个客户端然后处理其他 20 个(最坏的情况,假设所有 20 个其他客户端都需要读取)然后接受第 22 个?如果我在接受客户端后打破循环,以便它可以再次选择()并在处理连接的客户端之前处理所有待处理的客户端,会更好吗?或者这是否违背了使用 select() 的目的?谢谢。

最佳答案

您链接到的示例中显示的服务器模式很好;每次迭代只接受一个套接字的循环没有引入任何重大问题。

要牢记的关键点是,在精心设计的 select() 循环中,唯一进程应该曾经阻止的地方是在 select() 内部称呼。特别是,如果编码正确,服务器将永远不会在 send()、recv() 或 accept() 内部阻塞。最好将所有套接字设置为非阻塞模式(通过 fcntl(fd, F_SETFL, O_NONBLOCK))以保证此行为。

鉴于此,“在任何特定事件循环迭代中首先为哪些客户端提供服务”的精确排序并不重要,因为所有客户端的套接字在数据准备好读取(或缓冲区空间)后很快就会得到处理ready-for-write),并且所有新连接都会被快速接受。

关于c - 在服务器中使用 select() 处理新客户端的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7864206/

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