diff --git a/linker.doc.web/docs/4、通信功能/3.1、虚拟网卡.md b/linker.doc.web/docs/4、通信功能/3.1、虚拟网卡.md index cad072a1..2b2f1a9f 100644 --- a/linker.doc.web/docs/4、通信功能/3.1、虚拟网卡.md +++ b/linker.doc.web/docs/4、通信功能/3.1、虚拟网卡.md @@ -7,8 +7,9 @@ sidebar_position: 1 :::tip[说明] 1. 各个设备的`网卡IP`,不要一样,要同一网段,且不应该使用`1`、`255` -2. `局域网IP`,是选填的,可以不填,不懂是啥时,不要填、不要填、不要填 -3. 虽然支持UDP广播,但是UDP广播不会去主动连接所有设备,所以,你可以先 ping 以下对方,让两端相互连接 +2. 请使用 `10.0.0.0 - 10.255.255.255`、`172.16.0.0 - 172.31.255.255`、`192.168.0.0 - 192.168.255.255` 范围内的IP +3. `局域网IP`,是选填的,可以不填,不懂是啥时,不要填、不要填、不要填 +4. 虽然支持UDP广播,但是UDP广播不会去主动连接所有设备,所以,你可以先 ping 以下对方,让两端相互连接 ::: diff --git a/linker.libs/CommandHelper.cs b/linker.libs/CommandHelper.cs index 2588e489..3c44dd5f 100644 --- a/linker.libs/CommandHelper.cs +++ b/linker.libs/CommandHelper.cs @@ -76,7 +76,7 @@ namespace linker.libs } else { - LoggerHelper.Instance.Warning(error); + LoggerHelper.Instance.Warning($"file:{fileName},arg:{arg},commands:{string.Join(Environment.NewLine,commands)} -> {error}"); } proc.WaitForExit(); proc.Close(); diff --git a/linker.tun/ILinkerTunDevice.cs b/linker.tun/ILinkerTunDevice.cs index 09eacdef..64c8c2ad 100644 --- a/linker.tun/ILinkerTunDevice.cs +++ b/linker.tun/ILinkerTunDevice.cs @@ -1,4 +1,5 @@ using System.Net; +using System.Net.Sockets; namespace linker.tun { @@ -55,7 +56,7 @@ namespace linker.tun /// /// /// 是不是网关,是网关,将使用NAT转发,不是网关将添加路由 - public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip,bool gateway); + public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip, bool gateway); /// /// 删除路由 /// @@ -114,6 +115,24 @@ namespace linker.tun /// 原始IP包 /// public ReadOnlyMemory IPPacket; + + public void Unpacket(ReadOnlyMemory buffer) + { + Packet = buffer; + IPPacket = buffer.Slice(4); + Version = (byte)(IPPacket.Span[0] >> 4 & 0b1111); + + if (Version == 4) + { + SourceIPAddress = IPPacket.Slice(12, 4); + DistIPAddress = IPPacket.Slice(16, 4); + } + else if (Version == 6) + { + SourceIPAddress = IPPacket.Slice(8, 16); + DistIPAddress = IPPacket.Slice(24, 16); + } + } } /// diff --git a/linker.tun/LinkerTunDeviceAdapter.cs b/linker.tun/LinkerTunDeviceAdapter.cs index 35806687..3550c236 100644 --- a/linker.tun/LinkerTunDeviceAdapter.cs +++ b/linker.tun/LinkerTunDeviceAdapter.cs @@ -191,21 +191,8 @@ namespace linker.tun LinkerTunDevicPacket packet = new LinkerTunDevicPacket(); - packet.Packet = buffer; - packet.IPPacket = buffer.Slice(4); + packet.Unpacket(buffer); - packet.Version = (byte)(packet.IPPacket.Span[0] >> 4 & 0b1111); - - if (packet.Version == 4) - { - packet.SourceIPAddress = packet.IPPacket.Slice(12, 4); - packet.DistIPAddress = packet.IPPacket.Slice(16, 4); - } - else if (packet.Version == 6) - { - packet.SourceIPAddress = packet.IPPacket.Slice(8, 16); - packet.DistIPAddress = packet.IPPacket.Slice(24, 16); - } await linkerTunDeviceCallback.Callback(packet).ConfigureAwait(false); } catch (Exception ex) diff --git a/linker/plugins/relay/transport/TransportSelfHost.cs b/linker/plugins/relay/transport/TransportSelfHost.cs index c607cb9e..aed40040 100644 --- a/linker/plugins/relay/transport/TransportSelfHost.cs +++ b/linker/plugins/relay/transport/TransportSelfHost.cs @@ -156,6 +156,7 @@ namespace linker.plugins.relay.transport { LoggerHelper.Instance.Error(ex); } + callback(null); } return false; } diff --git a/linker/plugins/tuntap/proxy/TuntapProxy.cs b/linker/plugins/tuntap/proxy/TuntapProxy.cs index 01ef2279..1435113b 100644 --- a/linker/plugins/tuntap/proxy/TuntapProxy.cs +++ b/linker/plugins/tuntap/proxy/TuntapProxy.cs @@ -10,6 +10,7 @@ using linker.plugins.tuntap.config; using linker.tun; using System.Buffers.Binary; using System.Net.Sockets; +using System.Net; namespace linker.plugins.tuntap.proxy { @@ -80,7 +81,7 @@ namespace linker.plugins.tuntap.proxy { if (connections.IsEmpty == false) { - await Task.WhenAll(connections.Values.Select(c => c.SendAsync(packet.Packet))); + await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet))); } } else @@ -97,13 +98,16 @@ namespace linker.plugins.tuntap.proxy { await connection.SendAsync(packet.Packet); } + else + { + } } } else if (packet.Version == 6 && (packet.DistIPAddress.Span[0] & 0xFF) == 0xFF) { if (connections.IsEmpty == false) { - await Task.WhenAll(connections.Values.Select(c => c.SendAsync(packet.Packet))); + await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet))); } } }