如何获取.NET分配的IP地址和端口号

6
我有两个 Windows Forms 应用程序,一个充当服务器 (即 Winform: 服务器角色),另一个充当客户端 (即 Winform: 客户端角色)。在我的局域网设置中,有 6 台电脑,这些电脑通过一个 8 端口交换机相互连接,每台电脑都有多个 LAN 卡。

有一台电脑运行 [Winform: 服务器角色],另外五台运行 [Winform: 客户端角色]。在 [Winform: 服务器角色] 中,我使用以下代码获取本地IP地址和端口号,[Winform: 服务器角色]将根据此自动分配的 IP 地址和端口号监听所有传入的 TCP 请求。

Dim Listener As System.Net.Sockets.TcpListener
Dim Client As New System.Net.Sockets.TcpClient
Dim Message As String = ""

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Listener = New System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 0)
    Listener.Start()
End Sub

所有的客户端如何在运行时知道我的服务器IP地址和端口号?
我需要澄清我的意图。我现在的方法可能是不正确的。我试图创建一种“零配置客户端-服务器网络”,这是即插即用的。服务器将知道客户端的位置,反之亦然。我知道有一个程序(即MaxiVista)已经完全做到了这一点。
MaxiVista有两个应用程序,即服务器和客户端。用户只需在指定为服务器角色的PC上执行服务器应用程序,在另一台指定为客户端角色的PC上执行客户端应用程序。然后,服务器将能够找到同一局域网中的所有正在执行的客户端。
我的意图就是这样。在同一局域网内使用即插即用的“零配置客户端-服务器网络”。
3个回答

3

实际上他们并不这样做。

你可以为yourappserver配置DNS指向你的服务器,然后让客户端连接到它,但这显然有点复杂(而且硬编码数值并不是一个很好的方法)。

你可以使用某种服务公告 - 例如通过mDNS。这通过使服务器定期公告“我是一台小服务器,矮而结实(WhateverYourAppIsCalled的服务器在12345端口上)”,并让你的客户端监听此类请求,甚至请求它们(“这里有没有WhateverYourAppIsCalled的服务器?”)。另请参见:http://en.wikipedia.org/wiki/Zero_configuration_networking#Service_discovery

(如果情况紧急,你可以让服务器向网络广播其存在,并让客户端监听此类广播,但那基本上就是重新实现mDNS)


2

客户端没有办法自动找出服务器的IP地址。以下是解决问题的一些选择:

  • 每个客户端都有某种初始化数据,告诉它服务器的位置(可以是数据库、ini文件等)。这些数据可能会被存储在本地。
  • 服务器有某种初始化数据,告诉它客户端的位置。然后,服务器可以使用该信息直接与客户端进行通信,或将其自己的IP地址写入客户端机器上的文件/数据库中,以供客户端查找。

2

将一个常用的机器名映射到IP地址是由命名服务完成的,DNS是标准服务。如果您无法让TcpClient.Connect(string, int)正常工作,请与您的局域网管理员联系。

您不能像那样让服务器在端口0上开始监听。它必须是一个已知的端口号,否则客户端将不知道在Connect()调用中使用哪个端口号。选择一个数字,任何数字,大于一千。比如1667。如果与正在使用相同端口号的另一个TCP服务器发生冲突,则会发现问题。在客户端中,服务器名称和端口号应该放在设置中,以便局域网管理员可以轻松更改。


我尝试创建一个“零配置客户端-服务器网络”,它可以即插即用。服务器将知道客户端的位置,反之亦然。我知道有一个程序(如MaxiVista)已经完美地做到这一点。 - user774411
嗯,你将必须编写完全不同类型的代码。例如,使用UDP周期性地在整个局域网广播服务可用性公告。这是用100美元的软件解决一美元问题的情况。 - Hans Passant
那是我应用的“特性”,即用户友好的软件。 - user774411
嗯,我以为你在寻找对程序员友好的软件。算了。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接