-1

我正在学习网络编程,我想创建一个基于 TCP 连接的简单 P2P 网络。

到目前为止,我有一个接受来自客户端(TCP)的连接的服务器。客户端知道服务器的初始位置。

这些是我的问题:

  1. 服务器如何相互通知客户端?是否只是将每个人的 IP 地址列表发送给每个人?

  2. 如果所有客户端都在同一台机器上运行(例如 127.0.0.1),它们在相互连接时是否需要使用不同的端口号?

  3. 如果我想保持 TCP 连接,对等点如何决定每对中谁是客户端,谁是服务器?当他向客户端发送信息时,也许这可以在服务器端完成。

我假设 TCP 连接在这种情况下并不理想,至少因为客户端必须为网络中的每个对等方维护单独的连接。虽然这更像是一个训练练习,我正在寻找一个可靠的连接,在那里我不必处理一些数据包丢失/乱序的可能性。(在这个阶段:)。

谢谢!

4

2 回答 2

1

对于问题一,这取决于您的设计,但定期向连接的客户端通知其他客户端是一种方法。

至于第二个问题,如果一个客户端也应该充当其他客户端的服务器,那么他们别无选择,因为每个客户端都需要绑定到本地地址(ip-address/port-number 对),如果一个端口在一个使用特定的 IP 地址,然后您必须选择另一个。这可以通过在绑定时将端口设置为零来自动执行,并且操作系统会为您选择一个端口。

至于第三个问题,为什么一个客户端不能既是客户端又是服务器呢?客户端连接到中央服务器,该服务器跟踪网络中的所有客户端,并且可能还处理来自客户端的查询。当中央服务器接收到一个查询时,它将它发送给所有其他连接的客户端,并回复查询客户端关于其他客户端有什么它搜索的任何内容。然后,原始客户端连接到具有它搜索的任何内容的其他客户端,然后这些客户端充当原始客户端的服务器。

像这样的东西:

  1. 客户端 A、B、C 和 D 连接到服务器
  2. 客户端 A 向服务器发送查询
  3. 服务器向客户端 B、C 和 D 发送查询
  4. 客户 B 和 D 回复说他们有查询的内容
  5. 服务器将信息发送回客户端 A
  6. 客户端 A 连接到客户端 B 和 D

现在客户端 B 和 D 既充当客户端又充当服务器。它还解决了您的第一个问题,因为服务器仅在需要时发送有关其他客户端的信息。

于 2013-09-02T10:53:38.250 回答
1
  1. 我认为答案是肯定的。
  2. 您还可以为同一服务器上的客户端使用其他 Linux IPC 机制,例如共享内存,而不是套接字
  3. 建立连接时区分服务器/客户端角色:服务器正在侦听/接受,客户端正在连接。建立连接后,它们处于对等关系。
于 2013-09-02T10:53:59.703 回答