c-具有多个客户端的UDP客户端服务器
好的,情况是这样的。 我需要使用UDP构建一个客户端服务器 服务器必须运行第三个程序并通过管道将其传输到客户端(我已经用TCP和命名管道完成了这个应用程序,我只是将fifo或套接字的文件描述符“复制”到运行第三个程序的子程序) 问题出现在udp中,我无法复制套接字,因为它可能用于多个客户端(每个客户端的应用程序必须是唯一的),所以我有点结巴 我正在考虑在服务器和子服务器之间使用命名管道 (因此,客户机将发送到服务器,服务器写入fifo,子机在fifo上响应,服务器响应客户机。例如,使用客户机ip作为fifo名称,因此很容易识别) 问题是,如果我将fifo复制到孩子身上,我将无法关闭和重新打开服务器上的fifo(这需要处理收到的每条消息) 这有什么办法吗?我希望它尽可能简单 编辑 好吧,我有点成功了(虽然不漂亮) 我这样做是为了使流程如下所示: 客户端->服务器->该客户端的管道(如果它不存在,则创建一个子级并添加该子级的管道)->子级->管道->服务器->客户端 管道结构如下所示:c-具有多个客户端的UDP客户端服务器,c,sockets,udp,named-pipes,C,Sockets,Udp,Named Pipes,好的,情况是这样的。 我需要使用UDP构建一个客户端服务器 服务器必须运行第三个程序并通过管道将其传输到客户端(我已经用TCP和命名管道完成了这个应用程序,我只是将fifo或套接字的文件描述符“复制”到运行第三个程序的子程序) 问题出现在udp中,我无法复制套接字,因为它可能用于多个客户端(每个客户端的应用程序必须是唯一的),所以我有点结巴 我正在考虑在服务器和子服务器之间使用命名管道 (因此,客户机将发送到服务器,服务器写入fifo,子机在fifo上响应,服务器响应客户机。例如,使用客户机ip
typedef struct _pipes{
char ip_client[SIZE_IP];
int fd_read;
int fd_write;
int child_pid;
struct _pipes *next;
} pipes;
收到消息(recvfrom)时,我会搜索具有该IP的管道,如果找不到,则创建管道,分叉并完成结构(并将其添加到列表中)。您的问题是UDP服务器使用单个套接字与所有客户端通信。不一定要这样。例如,您可以有一个客户端可以连接的套接字,但只能使用它建立“会话”,该会话将在服务器创建的新套接字上继续 您还可以通过让服务器使用“发件人”地址(例如,通过
recvfrom()
)来区分客户端,将消息发送到正确的子进程,然后将结果返回给原始客户端(例如,通过sendto()
)
事实上,由于UDP的性质,您可能不得不使用第二个选项。例如,如果子程序一次写入超过1500个字节,那么这些字节将不能全部放入单个UDP数据报中,因此将被静默截断。这将是不好的,因此您可能需要在服务器中添加逻辑,以便在发送到客户端之前对数据进行分段。服务器是否为每个客户端生成一个子程序,或者为所有客户端生成一个子程序?数据流是什么样的?我理解你的大部分要求,但细节还不是很清楚。每个客户端一个孩子(孩子制作dup来替换标准输入和标准输出,然后执行)客户端->服务器->管道\u为\u儿童客户端->儿童->管道->服务器->客户端我目前正在尝试通过管道将每个孩子与服务器连接(每个孩子2个管道),为此,我必须创建如下列表:typedef struct_pipes{char ip_client[SIZE_ip];int fd_read;int fd_write;int child_pid;struct_pipes*next;}pipes;我还没有放弃这种可能性,但我不确定它是否会起作用,而且我肯定它不太好。我在使用这个函数时,问题是将它们作为stdin/链接到服务器创建的子对象之外(我试图通过为每个客户端子对象创建管道来解决这个问题,通过服务器中的列表将它们连接起来)。我认为这可能会奏效。如果是的话,我用答案编辑