我正在写一个点对点聊天程序。在此程序中,客户端和服务器功能写在一个唯一的文件中。首先,我想问一下我的程序中的机制是否正确。
- 我fork()两个进程,一个用于客户端功能,一个用于服务器功能
- 在服务器进程中,我初始化套接字,执行bind(),listen()。然后我使用select()来处理来自客户端的多连接。在客户端进程中,我初始化socket,执行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获取此信息?非常感谢您的回复。
答案 0 :(得分:0)
第一个问题:我宁愿使用一个单独的进程而不是两个进程,因为数据交换会更简单。然后选择单线程解决方案(select()ing,没有来自网络的超时和来自循环中的用户输入)或两线程解决方案我可能会保留2个线程,这有点复杂但对响应更快用户。
其余的机制似乎是正确的,但可能会根据第二个问题所要求的实施情况而有所不同
第二个问题:我认为你总是需要传递至少一个活动客户端的hostname:port作为参数。
我会开发这个解决方案:如果没有传递hostname:port,那么客户端什么都不做(它可能是网络的第一个节点);如果存在这样的信息,那么首先客户端应该尝试连接到给定的地址。
第一个联系人后面应该跟一个特殊命令,该命令使联系的服务器共享网络中每个其他活动节点的信息。在您的情况下,我将启动P2P2为“ p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1 ”。然后
现在您可以将P2P3作为“p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1 ”或“p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P2 ”启动。我们假设您将其连接到P2P2