【问题标题】:Is client-client communication possible in a fork-based server?在基于分叉的服务器中是否可以进行客户端-客户端通信?
【发布时间】:2017-12-11 06:12:17
【问题描述】:

我正在实现一个非常基本的 C 服务器,它允许客户端聊天。现在我正在使用 fork(),但我无法让客户端看到彼此的消息。

似乎所有客户端都从accept() 获得相同的文件描述符。基本上,我有一个 while 循环,我在其中测试是否有人想连接 select()、accept() 他们的连接和 fork()。之后,我阅读输入并尝试将它们传递给所有用户(我将其保存在列表中)。如有必要,我可以复制/粘贴我的代码。

那么,是否可以让客户端与进程通信,还是我必须使用 pthreads?

【问题讨论】:

    标签: c sockets fork


    【解决方案1】:

    Inter-process communication -IPC-(通常)不关心客户端与服务器(connect 阶段除外)。给定进程可以同时具有客户端和服务器角色(在不同的套接字上),并且会在某些 event loop 的多个套接字上使用 poll(2) 或旧的 select

    注意processes 有各自的virtual address space,而threads 共享相同 虚拟地址空间(包含它们的进程之一)。阅读一些 pthread tutorial 和一些关于 POSIX 编程的书(也许是旧的 ALP)。请注意,可以通过/proc/ 在 Linux 上查询有关进程的大量信息(请参阅proc(5) 了解更多信息)。特别是pid为1234的进程的虚拟地址空间可以通过/proc/1234/maps获取,其打开的文件描述符可以通过/proc/1234/fd//proc/1234/fdinfo/等获取......

    但是,编写一个保持共享状态并向客户端发送消息的公共服务器更简单。

    您可以设计一个协议,让客户端可以通过某种方式启动该 IPC。例如,如果所有进程都在同一台机器上,您可以有一个协议来传输文件路径,用作unix(7) 套接字地址或fifo(7),然后每个“客户端”进程启动(带有一些@987654340 @) 与另一个“客户”的直接通信。这样做可能是不明智的。

    还可以查看 0mq 之类的库。他们经常是free software,所以你可以研究他们的源代码。

    【讨论】:

    • 是的,我不完全喜欢直接客户端-客户端通信的想法,而我已经拥有服务器上所有客户端的列表。我猜它是 pthreads...
    • 我知道它可以用 pthreads 来完成,但想知道是否也可以用进程来完成。它只是一个本地聊天服务器。
    • 是的,您可以使用线程或进程。但编程模型非常不同。
    • 我刚刚有了一个可能是天才的想法:我可以将 accept() 返回的文件描述符操作为我想要的值吗?我可以使用 fork() 中的进程 ID 添加它,并为每个用户获取一个唯一的文件描述符!
    • 小心(也许更谦虚)关于亲切的想法......文件描述符是一些抽象数据类型(内部表示为一些小的非负整数)。
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多