【问题标题】:ConnectionRefused in windows 10 IoTWindows 10 IoT 中的 ConnectionRefused
【发布时间】:2019-08-27 13:39:35
【问题描述】:

我已经创建了一个 DHCP 服务器并添加了一个 TCP 服务器。当我在 DHCP 服务器的 IPv4 地址发送消息时,客户端会回复:ConnectionRefused

我已将属性设置为 true

DataSocket = new DatagramSocket();
DataSocket.Control.MulticastOnly = true;

此代码运行以启动应用程序 UWP:

private void Start()
{
  if (this.StatusButton.Content.ToString().Equals(AVVIA))
  {
    this.ViewModel.Action = "AVVIO DEL SERVER DHCP IN CORSO...";
    RunServer();
    this.StatusButton.Content = UPDATE;
    Task.Run(async () => 
    {
      await Task.Delay(DELAY);
      Server = new Server();
      Server.StartServer();
     });
  }

  ... ... ...

private void RunServer()
{
  IPAddress iPAddress;

  DhcpServer = new ScaemDhcp.DhcpServer();
  iPAddress = new IPAddress(new byte[] { 192, 168, 1, 101 });
  DhcpServer.Run(iPAddress, DNS, SUB_MASK, SERVER_IDENTIFIER, ROUTER_IP);
}
public void Run(IPAddress iPAddress, string dns, string subnetMask, string serverIdentifier, string routerIP)
{
  var server = new Dhcp(iPAddress);
  server.ServerName = dns;
  server.BroadcastAddress = IPAddress.Broadcast.ToString();
  server.OnDataReceived += (sender, dhcpRequest) =>
  {
    try
    {
      var type = dhcpRequest.GetMsgType();
      var ip = iPAddress;
      var replyOptions = new DhcpReplyOptions();
      replyOptions.SubnetMask = IPAddress.Parse(subnetMask);
      replyOptions.DomainName = server.ServerName;
      replyOptions.ServerIdentifier = IPAddress.Parse(serverIdentifier);
      replyOptions.RouterIP = IPAddress.Parse(routerIP);
      replyOptions.DomainNameServers = new IPAddress[]
      {IPAddress.Parse("8.8.8.8"), IPAddress.Parse("8.8.4.4")};

      if (type == DhcpMsgType.DHCPDISCOVER)
      {
        dhcpRequest.SendDHCPReply(DhcpMsgType.DHCPOFFER, ip, replyOptions);
      }
      if (type == DhcpMsgType.DHCPREQUEST)
      {
        dhcpRequest.SendDHCPReply(DhcpMsgType.DHCPACK, ip, replyOptions);
      }
    }
    catch (Exception e)
    { }
 };
 server.Start();
}

... ...

public async void StartServer()
{
  try
  {
    var streamSocketListener = new StreamSocketListener();

    streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;

    await streamSocketListener.BindServiceNameAsync(PORT.ToString());
   }
   catch (Exception ex)
   {
       ... ...

【问题讨论】:

  • TCP 不支持多播。多播只是 UDP。
  • 我已添加此支持(多播)以测试所有可能的解决方案(我处于绝望模式)...
  • 组播是广播,无法连接。组播仅适用于 IP 224.X.X.X 到 239.X.X.X。您可以为多播和非多播设置 UDP 广播。 DCHP 使用端口 67 和 68,这可能已被病毒检查程序或防火墙阻止。参见维基:en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
  • 我已经删除了多播,结果我发现 DHCP 服务器工作正常,但我在 Win 10 IoT 中的 TCP 服务器根本无法工作。我已通过以太网将 Raspberry (Win 10 IoT) 与我的 PC 连接起来。结果是:PC 需要并获得一个 IPv4、GW 等...如 DHCP 服务器中设置的那样。然后我(在 PC 中)运行一个客户端 TCP,用于向我的 Raspberry(Win 10 IoT)发送消息,这里我正在执行一个 TCP 服务器。客户端的结果是:ConnectionRefused。
  • DCHP 是 UDP 广播。 IP:源=0.0.0.0(服务器);目的地=255.255.255.255(广播IP)UDP:源端口=68;目的端口=67

标签: c# tcp uwp windows-10-iot-core dhcp


【解决方案1】:

首先,您需要检查您是否添加了能力Private Networks (Client & Server),该能力提供通过防火墙对家庭和工作网络的入站和出站访问。请参考此文档(enter link description here)。

然后,你需要检查端口是否可用,你可以在防火墙中添加5037端口的规则,请尝试以下命令。

netsh advfirewall firewall add rule name="5037 In" dir=in protocol=TCP localport=5037 action=Allow
netsh advfirewall firewall add rule name="5037 Out" dir=out protocol=TCP localport=5037 action=Allow

【讨论】:

  • 我没有好消息。我开始怀疑在 PC 中运行的客户端。放置部分代码:await streamSocket.ConnectAsync("192.168.1.101", "5037");
  • @Nicolò,你提到过这个document吗?本主题介绍如何使用通用 Windows 平台 (UWP) 套接字类来创建服务器和客户端。
  • 是的,我提到了这个document,但只有客户端 TCP 在我的 PC 中执行。
  • @Nicolò,我想和你确认一件事。 1. 有没有用ping 命令检查网络是否正常,PC 客户端是否可以访问设备? 2.客户端连接服务器时,是否有异常抛出,请提供错误信息。您可以尝试使用另一个套接字测试工具来连接服务器/端口。如果可能,请分享您的项目,以便我重现您的问题。
  • 请尝试在 Windows IoT Core 上运行命令netsh advfirewall firewall show rule name=all,以确认配置了端口 5073 的规则。
【解决方案2】:

来自@Michale Xu - MSFT 的评论

@Nicolò,我已经在MSDN forum 上回复了类似的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多