Ejemplo n.º 1
0
        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();
                        }
                    });
                }
            });
        }
Ejemplo n.º 2
0
        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}");
                });
            });
        }
Ejemplo n.º 3
0
        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();
                        }
                    });
                }
            });
        }