Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c-具有多个客户端的UDP客户端服务器_C_Sockets_Udp_Named Pipes - Fatal编程技术网

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

c-具有多个客户端的UDP客户端服务器,c,sockets,udp,named-pipes,C,Sockets,Udp,Named Pipes,好的,情况是这样的。 我需要使用UDP构建一个客户端服务器 服务器必须运行第三个程序并通过管道将其传输到客户端(我已经用TCP和命名管道完成了这个应用程序,我只是将fifo或套接字的文件描述符“复制”到运行第三个程序的子程序) 问题出现在udp中,我无法复制套接字,因为它可能用于多个客户端(每个客户端的应用程序必须是唯一的),所以我有点结巴 我正在考虑在服务器和子服务器之间使用命名管道 (因此,客户机将发送到服务器,服务器写入fifo,子机在fifo上响应,服务器响应客户机。例如,使用客户机ip

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

您的问题是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/链接到服务器创建的子对象之外(我试图通过为每个客户端子对象创建管道来解决这个问题,通过服务器中的列表将它们连接起来)。我认为这可能会奏效。如果是的话,我用答案编辑