尝试使用TcpListener库启动NModbus4,但它不会从特定的IP地址开始。下面是我的代码:
case "TCP":
try
{
TcpListener slaveTcpListener = new TcpListener(IP, Port);
slaveTcpListener.Start(); // Error occurs here
slave = ModbusTcpSlave.CreateTcp(SlaveID, slaveTcpListener);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore(MaxCoil, MaxDI, MaxHR, MaxIR);
slave.DataStore.DataStoreReadFrom += new EventHandler<DataStoreEventArgs>(dataStore_DataStoreReadFrom);
slave.ModbusSlaveRequestReceived += Slave_ModbusSlaveRequestReceived;
slave.Listen();
}
catch
{
// Exception Handle
}
该代码在IP (如127.0.0.1
)中运行良好,但不适用于类似于50.50.50.50
的东西。
它在以下几个方面失败:
slaveTcpListener.Start();
即使我验证输入IP地址(50.50.50.50
通过了IP验证),代码在这一行也会失败,我不知道如何处理这个问题。
发布于 2022-06-20 02:16:10
根据医生们
此构造函数允许您指定侦听传入连接尝试的本地IP地址和端口号。
现在,您没有说明您得到了什么错误(可能是“所请求的地址在其上下文中无效”),但我敢打赌,50.50.50.50
不是“本地IP地址”(即分配给正在运行的代码的计算机的IP地址)。
您的计算机(或实际上它的网络接口)将被分配给他们IP地址(Es)。TcpListener
为您提供了指定要侦听哪个地址的能力。
127.0.0.1
是环回地址。如果您监听此地址,则只能建立本地连接(另一台计算机将无法通过网络连接到您的程序)。
IPAddress.Any
表示服务器必须侦听所有网络接口上的客户端活动。这就是你可能想要的(即TcpListener slaveTcpListener = new TcpListener(IPAddress.Any, Port);
)
或者,您可以指定一个特定的地址;但是要使其工作,该地址必须是本地IP地址。有关识别本地IP地址的帮助,请参见这个答案。
发布于 2022-06-20 02:17:06
50.50.50.50
只是一个有效的IPAddress,因为它在语法上是正确的,可以在不抛出异常的情况下进行解析。要在该IP上启动TcpListener,IP必须在您的网络接口上是有效的和“可单击的”。最有可能的是,您正在尝试的IP不在您的HostEntries中。
要获得有效本地主机项的列表,可以枚举从System.Net.Dns.GetHostName
方法返回的列表:
internal static IEnumerable<IPAddress> GetLocalHostIPs() {
foreach (var ip in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
yield return ip;
}
正如英国人所指出的,在大多数用例中,使用IPAddress.Any
是您应该使用的。如果你只想听一个特定的网卡,你应该首先检查你想要的IP是否在主机的地址列表中。在不抛出的情况下,一种可能的方法是使用类似于以下功能的实用程序函数:
using System.Net;
/// <summary>
/// Parses an IP string, and verifies that it is in the HostEntry's AddressList.
/// </summary>
/// <param name="localIPString">The string to parse and verify</param>
/// <returns><paramref name="localIPString"/>, if it is a valid local IP and found in the HostName's AddressList; otherwise, <see cref="IPAddress.Any"/></returns>
public static IPAddress TryLocalIPOrAny(string localIPString)
{
if (localIPString != null && IPAddress.TryParse(localIPString, out IPAddress address))
{
if (Dns.GetHostEntry(Dns.GetHostName()).AddressList.Contains(address))
{
return address;
}
}
return IPAddress.Any;
}
然后,在使用该函数调用启动侦听器时,只需将您的IP包起来:
var slaveTcpListener = new TcpListener(TryLocalIPOrAny("50.50.50.50"), 0);
//...
https://stackoverflow.com/questions/72681439
复制相似问题