【问题标题】:How do you discover a TCPListener Service's IPaddress?如何发现 TCPListener 服务的 IP 地址?
【发布时间】:2014-05-06 08:59:36
【问题描述】:

当从 LAN 上的另一台机器向 TcpListener 服务发送消息时,您需要知道服务器的 ip 地址和端口。该端口很可能是已知的,因为您可能选择了它,但如果 IP 地址可能不同,有什么方法可以发现该 IP 地址。

在我看来,您需要完全通过另一种方法将此信息提供给发件人。

【问题讨论】:

标签: c# sockets tcplistener


【解决方案1】:

实现此目的的一种方法是使用 UDP 多播。

基本上,您的所有应用程序都在一个众所周知的(当然是预先确定的)多播 IP 和端口上进行侦听。然后每个主机向该地址广播,并在消息正文中包含它们的 TCP IP 和用于建立 TCP 连接的端口。如果是游戏大厅系统,还可以包含玩家总数、需要多少人等信息。

请注意,您可以控制广播的频率,当我这样做时,1000 毫秒的轮询间隔就足够了,但您可以将其设置为您想要的任何值(基于您的 LAN 速率、数据包大小等)

UdpClient.JoinMulticastGroup on MSDN

还有一点你应该知道,多播IP范围是:

多播地址范围为 224.0.0.0 到 239.255.255.255。

Technet

由于某些原因,信息不是很容易找到:)

【讨论】:

  • 谢谢。事实证明,这对我来说是非常宝贵的知识,并且对我有很大帮助。
  • 没问题,我添加了可接受的 UDP 多播范围,因为它需要一些谷歌搜索才能找到它。如果还有什么我可以帮忙的,请告诉我!
  • 是的,这是一个可靠的答案。几个月来一直在做低级套接字工作,但从来不知道这存在。好的! :)
  • 感谢@BradleyDotNET。对多播有所了解,但从未使用过。我会试试这个。您是否遇到或听说过有关多播网络基础设施限制的任何问题?
  • @MaxwellTroyMiltonKing,我曾经使用的无线路由器不允许我打开 UDP 套接字,所以我想有一些限制。您还必须保持在发布的 IP 范围内。我不知道任何其他问题,但对于不是该技术的 IT 方面的专家,我深表歉意:(。对于 ServerFault 来说可能是一个好问题!
【解决方案2】:

TCPListener 实现这一点没有什么神奇的。您需要提供一种机制来将该信息传递给客户端。我能想到的几种方法:

  • 使用 DNS 或目录服务(例如 LDAP 或 Active Directory)
  • 使用注册服务(即您的服务器向服务器注册自身,可能会每隔一段时间刷新一次,然后客户端从那里检索服务器地址)
  • 服务器响应任何客户端广播请求(有点类似于 ARP)

我有一个类似的项目,并使用注册表和心跳服务作为一个运行良好的解决方案。您可以使用 Zookeeper 或 Redis(或其他一些轻量级数据存储)之类的东西来保留注册,或者如果您愿意,当然也可以自己编写。

【讨论】:

  • 谢谢。您的答案是正确的,但也是我最初想到的答案。我放弃了这条路径,因为我需要避免让客户需要知道所需数据的下落。诀窍是我还在 tcplistener 所在的同一台机器上托管的 wcf 服务中使用发现,所以我最终使用发现来捕获 IP 地址。
  • 这很有趣。我仍然认为注册表类型的服务可能很有用,因为您可以在其上存储更多元数据; BradleyDotNETs 的回答让我想到了一种混合方法,其中客户端和服务器使用多播来查找注册表服务。
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多