c - 具有多个客户端的 UDP 客户端-服务器

Posted

技术标签:

【中文标题】c - 具有多个客户端的 UDP 客户端-服务器【英文标题】:c - UDP client-server with multiple clients 【发布时间】:2015-01-12 02:59:21 【问题描述】:

好的,情况就是这样。 我需要使用 UDP 构建客户端-服务器。

服务器必须运行第三个程序并将其通过管道传输到客户端(我已经使用 TCP 和命名管道完成了这个应用程序,我只是将 fifo 或套接字的文件描述符“复制”给运行第三个程序的子程序) .

问题出在 udp 中,我无法复制套接字,因为它可能用于多个客户端(并且每个客户端的应用程序必须是唯一的),所以我有点卡住了。

我正在考虑在服务器和孩子之间使用命名管道 (所以客户端会发送到服务器,服务器在 fifo 上写入,孩子在 fifo 上响应,服务器响应客户端。例如使用客户端 ip 作为 fifo 名称,因此很容易识别)。

问题是,如果我在子节点上复制 fifo,我将无法关闭并重新打开服务器上的 fifo(我需要对收到的每条消息执行此操作)...

有没有办法解决这个问题?我想让它尽可能简单。

编辑 好的,我有点让它工作了(虽然它不是很漂亮)。

我做到了,流程如下: 客户端 -> 服务器 -> 该客户端的管道(如果不存在,则创建一个子节点并添加该子节点的管道)-> 子节点 -> 管道 -> 服务器 -> 客户端

管道结构是这样的:

typedef struct _pipes
    char ip_client[SIZE_IP];
    int fd_read;
    int fd_write;
    int child_pid;
    struct _pipes *next;
 pipes; 

当收到一条消息 (recvfrom) 时,我会搜索具有该 IP 的管道,如果没有找到,则创建一个管道,分叉并完成结构(并将其添加到列表中)。

【问题讨论】:

服务器为每个客户端生成一个子程序,还是为所有客户端只生成一个子程序?数据流是什么样的?我明白你的大部分问题,但细节还不是很清楚。 每个客户端一个孩子(孩子做 dup 替换标准输入和标准输出,然后执行)客户端 -> 服务器 -> pipe_for_child-client -> 孩子 -> 管道 -> 服务器 -> 客户端 我是目前试图通过管道将每个孩子与服务器连接(每个孩子 2 个管道),为此我必须创建一个这样的列表: typedef struct _pipes char ip_client[SIZE_IP]; int fd_read; int fd_write; int child_pid;结构 _pipes *next; 管道;我还没有放弃这种可能性,但我不确定它是否会起作用,我确信它不漂亮 【参考方案1】:

您的问题是 UDP 服务器使用单个套接字与其所有客户端进行通信。它不必是这样的。例如,您可以有一个客户端可以连接到的单个套接字,但仅使用它来建立一个“会话”,该会话将在服务器创建的新套接字上继续。

您还可以手动执行一些操作,让服务器使用“发件人”地址(例如通过recvfrom())来区分客户端,将消息发送到正确的子进程,然后将结果返回给发起客户端(例如,通过sendto())。

事实上,由于 UDP 的性质,您可能不得不使用第二个选项。例如,如果子程序一次写入超过 1500 个字节,则不会全部适合单个 UDP 数据报,因此将被静默截断。这会很糟糕,因此您可能需要在服务器中添加逻辑以在发送到客户端之前对数据进行分段。

【讨论】:

我正在使用这个函数,问题是将它们链接为服务器创建的子节点的标准输入/输出(我试图通过为每个客户端子节点创建管道来解决这个问题,通过服务器中的列表)。我认为这可能会奏效。如果是这样,我用答案编辑

以上是关于c - 具有多个客户端的 UDP 客户端-服务器的主要内容,如果未能解决你的问题,请参考以下文章

c#UDP聊天程序,关于服务端和客户端的功能!急!!!!

C语言 UDP socket 简单客户端 编程,急

c# udp 聊天 服务器发到客户端的数据为啥接受不到

用于 UDP 客户端的 Windows C 套接字编程

是否有具有多个命名 Oidc 客户端的示例 quarkus 项目来调用多个服务调用?

UDP 客户端未收到来自具有多个 IP 地址的服务器的回复