private void ListenPortMapPortWithServerName(PortMapItem item) { TcpListener listener = new TcpListener(IPAddress.Any, item.LocalPort); try { listener.Start(); } catch (Exception ex) { LogUtils.Error($"【失败】端口映射:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}{Environment.NewLine}{ex.ToString()}"); return; } ListenerList.Add(listener); LogUtils.Show($"【成功】端口映射:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}"); Global.TaskFactory.StartNew(() => { while (true) { Socket socket = listener.AcceptSocket(); P2PTcpClient tcpClient = new P2PTcpClient(socket); Global.TaskFactory.StartNew(() => { string token = tcpClient.Token; //获取目标tcp if (Global.TcpMap.ContainsKey(item.RemoteAddress) && Global.TcpMap[item.RemoteAddress].TcpClient.Connected) { //加入待连接集合 Global.WaiteConnetctTcp.Add(token, tcpClient); //发送p2p申请 Models.Send.Send_0x0211 packet = new Models.Send.Send_0x0211(token, item.RemotePort); Global.TcpMap[item.RemoteAddress].TcpClient.Client.Send(packet.PackData()); Global.TaskFactory.StartNew(() => { Thread.Sleep(Global.P2PTimeout); //如果5秒后没有匹配成功,则关闭连接 if (Global.WaiteConnetctTcp.ContainsKey(token)) { LogUtils.Warning($"【失败】内网穿透:{Global.P2PTimeout}秒无响应,已超时."); Global.WaiteConnetctTcp[token].Close(); Global.WaiteConnetctTcp.Remove(token); } }); } else { LogUtils.Warning($"【失败】内网穿透:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort} 客户端不在线!"); tcpClient.Close(); } }); } }); }
public void AcceptSocket_ClientName(IAsyncResult ar) { ListenSt st = (ListenSt)ar.AsyncState; TcpListener listener = st.listener; PortMapItem item = st.item; Socket socket = null; EasyOp.Do(() => { socket = listener.EndAcceptSocket(ar); }, () => { EasyOp.Do(() => { listener.BeginAcceptSocket(AcceptSocket_ClientName, st); }, exx => { LogUtils.Error($"端口监听失败:{Environment.NewLine}{exx}"); }); LogUtils.Debug($"开始内网穿透:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}", false); P2PTcpClient tcpClient = null; EasyOp.Do(() => { tcpClient = new P2PTcpClient(socket); }, () => { string token = tcpClient.Token; //获取目标tcp if (clientCenter.TcpMap.ContainsKey(item.RemoteAddress) && clientCenter.TcpMap[item.RemoteAddress].TcpClient.Connected) { //加入待连接集合 clientCenter.WaiteConnetctTcp.Add(token, tcpClient); //发送p2p申请 Models.Send.Send_0x0211 packet = new Models.Send.Send_0x0211(token, item.RemotePort, tcpClient.RemoteEndPoint); EasyOp.Do(() => { clientCenter.TcpMap[item.RemoteAddress].TcpClient.BeginSend(packet.PackData()); }, () => { Thread.Sleep(appCenter.Config.P2PTimeout); //如果指定时间内没有匹配成功,则关闭连接 if (clientCenter.WaiteConnetctTcp.ContainsKey(token)) { LogUtils.Debug($"建立隧道失败{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort},{appCenter.Config.P2PTimeout / 1000}秒无响应,已超时."); EasyOp.Do(() => tcpClient?.SafeClose()); EasyOp.Do(() => clientCenter.WaiteConnetctTcp[token]?.SafeClose()); clientCenter.WaiteConnetctTcp.Remove(token); } }, ex => { LogUtils.Debug($"建立隧道失败{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort},目标客户端已断开连接!"); EasyOp.Do(() => tcpClient?.SafeClose()); if (clientCenter.WaiteConnetctTcp.ContainsKey(token)) { EasyOp.Do(() => clientCenter.WaiteConnetctTcp[token]?.SafeClose()); clientCenter.WaiteConnetctTcp.Remove(token); } }); } else { LogUtils.Debug($"建立隧道失败{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort},客户端不在线!"); EasyOp.Do(() => tcpClient?.SafeClose()); } }, ex => { LogUtils.Debug($"处理新接入Tcp时发生错误:{Environment.NewLine}{ex}"); EasyOp.Do(() => socket?.SafeClose()); }); }, ex => { LogUtils.Debug($"获取新接入的Tcp连接失败:{Environment.NewLine}{ex}"); EasyOp.Do(() => { listener.BeginAcceptSocket(AcceptSocket_ClientName, st); }, exx => { LogUtils.Error($"端口监听失败:{Environment.NewLine}{exx}"); }); }); }
private void ListenPortMapPortWithServerName(PortMapItem item) { TcpListener listener = new TcpListener(IPAddress.Any, item.LocalPort); try { listener.Start(); } catch (Exception ex) { LogUtils.Error($"【失败】端口映射:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}{Environment.NewLine}{ex.ToString()}"); return; } ListenerList.Add(listener); LogUtils.Info($"【成功】端口映射:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}", false); AppCenter.Instance.StartNewTask(() => { TcpManage tcpManage = null; if (item.RemotePort == 3389) { tcpManage = new TcpManage(6); } while (true) { Socket socket = listener.AcceptSocket(); string remoteAddress = ((IPEndPoint)socket.RemoteEndPoint).Address.ToString(); if (tcpManage != null) { tcpManage.AddTcp(remoteAddress); if (!tcpManage.IsAllowConnect(remoteAddress)) { LogUtils.Info($"【安全策略】阻止内网穿透:{remoteAddress}->{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}", false); socket.SafeClose(); continue; } } LogUtils.Info($"开始内网穿透:{remoteAddress}->{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort}", false); P2PTcpClient tcpClient = new P2PTcpClient(socket); AppCenter.Instance.StartNewTask(() => { string token = tcpClient.Token; //获取目标tcp if (ClientCenter.Instance.TcpMap.ContainsKey(item.RemoteAddress) && ClientCenter.Instance.TcpMap[item.RemoteAddress].TcpClient.Connected) { //加入待连接集合 ClientCenter.Instance.WaiteConnetctTcp.Add(token, tcpClient); //发送p2p申请 Models.Send.Send_0x0211 packet = new Models.Send.Send_0x0211(token, item.RemotePort, tcpClient.RemoteEndPoint); ClientCenter.Instance.TcpMap[item.RemoteAddress].TcpClient.Client.Send(packet.PackData()); AppCenter.Instance.StartNewTask(() => { Thread.Sleep(ConfigCenter.Instance.P2PTimeout); //如果5秒后没有匹配成功,则关闭连接 if (ClientCenter.Instance.WaiteConnetctTcp.ContainsKey(token)) { LogUtils.Warning($"【失败】内网穿透:{ConfigCenter.Instance.P2PTimeout / 1000}秒无响应,已超时."); ClientCenter.Instance.WaiteConnetctTcp[token].SafeClose(); ClientCenter.Instance.WaiteConnetctTcp.Remove(token); } }); } else { LogUtils.Warning($"【失败】内网穿透:{item.LocalPort}->{item.RemoteAddress}:{item.RemotePort} 客户端不在线!"); tcpClient.SafeClose(); } }); } }); }