我正在编写一个对等聊天程序。在此程序中,客户端和服务器功能被写入一个唯一的文件中。首先,我想问一下我程序中的机制是否正确。


  
  我fork()两个进程,一个用于客户端功能,一个用于服务器功能。
  在服务器进程中,我初始化套接字,执行bind(),listen()。然后,我使用select()处理来自客户端的多连接。在客户端进程中,我初始化套接字,执行connect()。
  创建第一个对等方时,客户端进程没有任何服务器可连接,因此它仅等待直到其他对等方出现。在这种情况下,我只需初始化一个套接字并等待。
  当创建下一个对等节点时,它们的客户端进程初始化套接字,执行connect()并将信息发送到第一个对等服务器的服务器进程,以请求加入。
  在服务器进程中,我在select()返回之后接收信息,并将反馈发送到发件人的客户端进程。
  


其次,例如,我的程序称为“ p2p”。我在一个终端(从我的程序)中启动一个实例,比如说,通过运行“ p2p Name_of_group Port_Number_for_Server_Side”来启动P2P1。这是网络的第一个对等点,它定义了一个组的名称和要侦听的端口。现在,我运行另一个实例(在另一个终端中),通过运行“ p2p Name_of_group Port_Number_for_Server_Side”来说P2P2。第二个对等方声明要加入的组的名称和侦听其服务器进程的端口。

P2P2的客户端进程通过将其信息发送到服务器进程P2P1连接到P2P1的服务器进程。但是,在这种情况下,P2P2的客户端进程不知道套接字的值,该套接字在P2P1的服务器进程中初始化为打开端口。所以我的问题是,当P2P2想要使用send()和recv()与P2P1通信时,如何从P2P1获取此信息?非常感谢您的回复。

最佳答案

第一个问题:由于数据交换会更简单,所以我宁愿使用一个进程而不是两个进程。然后选择单线程解决方案(select()不会从网络中超时,也不会从用户输入循环中选择)或两个线程解决方案,我可能会留在2个线程中,这虽然稍微复杂一些,但对用户。

其余机制似乎是正确的,但可能会根据第二个问题的要求而有所不同

第二个问题:我认为您总是需要传递至少一个活动客户端的hostname:port作为参数。

我将开发这种解决方案:如果未传递hostname:port,则客户端什么都不做(它可能是网络的第一个节点);如果存在此类信息,则客户端应首先尝试连接到给定地址。

在第一个联系人之后应跟随一个特殊命令,该命令使被联系的服务器共享网络中其他每个活动节点的信息。在您的情况下,我将以“ p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1”开头的P2P2。然后


P2P2连接到P2P1并询问其他节点
P2P1回答这是唯一的节点
现在P2P1和P2P2都知道网络是由两个节点组成的


现在,您可以启动一个P2P3,例如“ p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1”或“ p2p Name_of_group Port_Number_of_Server_Side Port_Number_of_P2P2”。假设您将其连接到P2P2


P2P3连接到P2P2,并要求其他活动节点
P2P2回复有关P2P1的地址信息
P2P3连接到P2P1,并且不要求任何内容(或者,如果您愿意,可以冗余)

关于c - 点对点聊天中程序的多个实例之间的通信-C语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22547402/

10-10 14:52