linux-arm 上的 NetCore IPV6 套接字连接失败

NetCore IPV6 socket connection fails on linux-arm

我正在尝试在 linux-arm 平台 (raspberry pi) 上与 net-core 3.0 建立 IPV6 套接字连接。

当我尝试将套接字绑定到本地以太网适配器时,抛出异常 ((22): 无效参数 [fe80::211c:bf90:fbbf:9800]:5400)。

当我在 windows 开发机器(使用不同的 link-local ip)上尝试相同时,一切正常。 IPV4 套接字连接也可以在我的 windows 开发机器和目标 linux-arm 平台上实现。

到源码: 我以微软的socket例子为基础,将IPV4地址改成IPV6地址。 "Bind" 方法后抛出异常。

这是客户端代码:

  //definet the target endpoint
    IPAddress ipAddress;
    IPAddress.TryParse("fe80::211c:bf90:fbbf:9800", out ipAddress);
    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 5400);

    // Create a TCP/IP  socket.  
    Socket sender = new Socket(ipAddress.AddressFamily ,SocketType.Stream, ProtocolType.Tcp);

    //bind to the local network interface
    IPAddress localIp;
    IPAddress.TryParse("fe80::833:e68b:32ee:4c39", out localIp); 
    EndPoint localEndPoint = new IPEndPoint(IPAddress.IPv6Any, 0);
    sender.Bind(localEndPoint);

    // Connect the socket to the remote endpoint. Catch any errors.  
    try
    {
      sender.Connect(remoteEP);

      Console.WriteLine("Socket connected to {0}",
          sender.RemoteEndPoint.ToString());

Ron 的输入实际上是缺失的部分。因此,目标端点 IpAddress 必须与 ScopeId (NIC Nr) 一起提供。

 //definet the target endpoint
    IPAddress ipAddress;
    IPAddress.TryParse("fe80::211c:bf90:fbbf:9800", out ipAddress);
    ipAddress.ScopeId = scopeId;
    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 5400);

以第一个 link 本地地址的范围 ID 例如可以使用此代码:

private static long GetScopeIdForHostLinkLocal()
    {
      IPAddress firstLinkLocal = null;
      var info = NetworkInterface.GetAllNetworkInterfaces();

      foreach (NetworkInterface nic in info)
      {
        var ipProps = nic.GetIPProperties();
        var uniAddresses = ipProps.UnicastAddresses;
        foreach (UnicastIPAddressInformation addressInfo in uniAddresses)
        {
          if (addressInfo.Address.IsIPv6LinkLocal)
          {
            firstLinkLocal = addressInfo.Address;
            break;
          }
        }

        if (firstLinkLocal != null)
        {
          break;
        }
      }

      if (firstLinkLocal != null)
      {
        return firstLinkLocal.ScopeId;
      }
      else
      {
        return -1;
      }
    }