我正在实现一个允许客户聊天的非常基本的C服务器。现在我正在使用fork(),但是我很难让客户看到对方的消息。
似乎所有客户端都从accept()获取相同的文件描述符。基本上,我有一个while循环,我测试是否有人想要连接select(),accept()他们的连接和fork()。之后我读取输入并尝试将它们传递给所有用户(我将其保留在列表中)。如有必要,我可以复制/粘贴我的代码。
那么,是否可以让客户端与进程通信,或者我是否必须使用pthreads?
答案 0 :(得分:2)
Inter-process communication -IPC-(一般情况下)不关心客户端与服务器(connect
阶段除外)。给定的进程可以同时具有客户端和服务器角色(在不同的套接字上),并且在某些poll(2)的几个套接字上使用event loop或较旧的select
。
请注意,processes各自拥有virtual address space,而threads共享相同的虚拟地址空间(其中包含的进程之一)。阅读一些pthread tutorial,以及一些关于POSIX编程的书(也许是旧的ALP)。请注意,可以在Linux /proc/
上查询有关流程的大量信息(有关详情,请参阅proc(5))。特别是,pid 1234的进程的虚拟地址空间可以通过/proc/1234/maps
及其打开的文件描述符通过/proc/1234/fd/
和/proc/1234/fdinfo/
等获得....
但是,编写保持共享状态的公共服务器并将消息分派给客户端更简单。
您可以设计一个协议,客户端可以通过某种方式启动该IPC。例如,如果所有进程都在同一台机器上,那么您可以使用一个协议来传输用作unix(7)套接字地址或fifo(7)的文件路径,以及每个"客户端&#34 ;过程稍后启动(与某些connect
)与另一个"客户端"的直接通信。这样做可能是不明智的。
另请参阅0mq等图书馆。它们通常是free software,因此您可以研究它们的源代码。