【发布时间】: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; } 管道;我还没有放弃这种可能性,但我不确定它是否会起作用,我确信它不漂亮
标签: c sockets udp named-pipes