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



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

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

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

到源代码: 我以微软的套接字示例为基础,将IPV4更改为IPV6地址。 异常在"绑定"方法之后引发。

这是客户端代码:

//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);

例如,对于第一个链路本地地址的范围 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;
}
}

最新更新