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;
}
}
我正在尝试在 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;
}
}