2015-01-12 362 views
1

好的,这里是情况。 我需要使用UDP构建客户端服务器。c - 具有多个客户端的UDP客户端服务器

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

问题进来UDP,我不能DUP插座,因为它可以被用于多个客户端(和应用程序必须为每个客户端是唯一的),所以我有点stucked。

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

问题是,如果我DUP儿童FIFO中,我将无法关闭并重新打开服务器上(我需要与所接收的每个消息做)先进先出...

有什么绕过这个方法?我希望保持尽可能简单。

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

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

管结构是这样的:

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

当一个消息被收到(recvfrom的),I搜索管与该IP,如果没有找到,创建一个管,分叉并完成结构(并将其添加到列表中)。

+0

服务器是否为每个客户端产生了一个子程序,或者是所有客户端只有一个子项?什么是数据流?我理解你所问的大部分内容,但细节还不是很清楚。 –

+0

每个客户端一个孩子(孩子让dup来替换stdin和stdout,然后执行) 客户端 - >服务器 - > pipe_for_child-client - >子 - >管道 - >服务器 - >客户端 我正在尝试通过管道将每个孩子与服务器连接起来(每个孩子2个管道),为此我必须创建一个如下列表: \t typedef struct _pipes { \t \t char ip_client [SIZE_IP]; \t \t int fd_read; \t \t int fd_write; \t \t int child_pid; \t \t struct _pipes * next; \t}管; 我还没有放弃这种可能性,但我不知道它会工作,我相信它不是很漂亮 –

回答

1

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

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

事实上,你可能必须使用第二个选择,由于UDP的性质。例如,如果子程序一次写入超过1500个字节,那么这将不会适用于单个UDP数据报,因此将被自动截断。这会很糟糕,所以您可能需要在发送到客户端之前在服务器中添加逻辑来分段数据。

+0

我正在使用这个功能,问题是将它们作为标准输入/出创建的孩子链接由服务器(我想通过创建每个客户端子的管道,通过服务器中的列表连接它们来解决这个问题)。我认为这可能会起作用。如果是这样,我编辑答案 –