问题描述
我正在做一个考试项目,witch 是一个带有 Linux 操作系统的 C 语言服务器/客户端应用程序。服务器需要向每个连接的客户端发送一个请求,然后它只获取一个响应,从第一个客户端开始回答。现在我如何跟踪所有连接的客户端?我正在使用调用 accept() 来获取用于与新客户端交谈的文件描述符,但我不知道如何以适当的方式存储多个文件描述符。另外,我是不是只得到第一个响应,而将其他所有响应都扔掉?
解决方法
我不知道如何以适当的方式存储多个。
如果您有一个构建客户端/服务器系统的考试项目,那么您必须已经精通 C 复合数据类型(如数组)和数据结构(如链表)。有鉴于此,您提出问题的事实让我认为您对文件描述符有误解。
具体来说,您必须假设它们的存储位置具有某种意义,但事实并非如此。文件描述符只是值,而不是对象——您可以将它们存储在任何合适的对象(变量、结构成员、数组元素)中,将它们复制到其他对象,通过参数和返回值与函数交换它们,等 em>...
因此,没有单一的“正确”方式来存储您的文件描述符。您可以使用适合您目的的任何数据类型或结构。例如,如果您有一个表示有关已连接客户端的数据的结构,那么我可能希望这些数据包含其连接的文件描述符(但这不一定是存储它的唯一位置)。
还有 [原文如此] 我是否只收到第一个回复而将其他回复全部丢弃?
这部分取决于服务器如何跟踪和维护每个客户端的状态(多线程?多进程?使用 select()
或 poll()
进行 I/O 多路复用?)以及应用程序级协议客户端和服务器用于通信。不过,基本上,您会在某处维护一个标志,说明是应用到达的下一个响应,还是只使用并丢弃它。