首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NModbus4 TcpListener不以有效的IP地址开头

NModbus4 TcpListener不以有效的IP地址开头
EN

Stack Overflow用户
提问于 2022-06-20 01:32:28
回答 2查看 137关注 0票数 0

尝试使用TcpListener库启动NModbus4,但它不会从特定的IP地址开始。下面是我的代码:

代码语言:javascript
复制
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的东西。

它在以下几个方面失败:

代码语言:javascript
复制
slaveTcpListener.Start();

即使我验证输入IP地址(50.50.50.50通过了IP验证),代码在这一行也会失败,我不知道如何处理这个问题。

EN

回答 2

Stack Overflow用户

发布于 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地址的帮助,请参见这个答案

票数 2
EN

Stack Overflow用户

发布于 2022-06-20 02:17:06

50.50.50.50只是一个有效的IPAddress,因为它在语法上是正确的,可以在不抛出异常的情况下进行解析。要在该IP上启动TcpListener,IP必须在您的网络接口上是有效的和“可单击的”。最有可能的是,您正在尝试的IP不在您的HostEntries中。

要获得有效本地主机项的列表,可以枚举从System.Net.Dns.GetHostName方法返回的列表:

代码语言:javascript
复制
internal static IEnumerable<IPAddress> GetLocalHostIPs() {
  foreach (var ip in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
    yield return ip;
}

正如英国人所指出的,在大多数用例中,使用IPAddress.Any是您应该使用的。如果你只想听一个特定的网卡,你应该首先检查你想要的IP是否在主机的地址列表中。在不抛出的情况下,一种可能的方法是使用类似于以下功能的实用程序函数:

代码语言:javascript
复制
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包起来:

代码语言:javascript
复制
var slaveTcpListener = new TcpListener(TryLocalIPOrAny("50.50.50.50"), 0);
//...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72681439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档