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

时间:2015-01-12 02:59:22

标签: c sockets udp named-pipes

好的,这就是情况。 我需要使用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的管道,如果没有找到,则创建一个管道,fork并完成该结构(并将其添加到列表中)。

1 个答案:

答案 0 :(得分:1)

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

您还可以通过让服务器使用“from”地址(例如,通过recvfrom())来区分客户端,将消息分派给正确的子进程,然后返回结果发送给原始客户(例如通过sendto())。

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