コード例 #1
0
 public void P2PBind_ServerTransfer(string token)
 {
     P2PTcpClient client = clientCenter.WaiteConnetctTcp[token];
     clientCenter.WaiteConnetctTcp.Remove(token);
     client.IsAuth = m_tcpClient.IsAuth = true;
     client.ToClient = m_tcpClient;
     m_tcpClient.ToClient = client;
     Send_0x0201_Success sendPacket = new Send_0x0201_Success(4);
     EasyOp.Do(() => client.BeginSend(sendPacket.PackData()));
     EasyOp.Do(() => m_tcpClient.BeginSend(sendPacket.PackData()));
     LogUtils.Debug($"成功建立中转模式隧道 token:{token}");
 }
コード例 #2
0
        public void P2PBind_ServerTransfer(string token)
        {
            LogUtils.Debug($"【P2P】内网穿透成功");
            P2PTcpClient client = ClientCenter.Instance.WaiteConnetctTcp[token];

            ClientCenter.Instance.WaiteConnetctTcp.Remove(token);
            client.IsAuth        = m_tcpClient.IsAuth = true;
            client.ToClient      = m_tcpClient;
            m_tcpClient.ToClient = client;
            Send_0x0201_Success sendPacket = new Send_0x0201_Success(4);

            client.Client.Send(sendPacket.PackData());
            m_tcpClient.Client.Send(sendPacket.PackData());
        }
コード例 #3
0
        public void P2PBind_DirectConnect(string token)
        {
            P2PTcpClient clientA = clientCenter.WaiteConnetctTcp[token];
            P2PTcpClient clientB = m_tcpClient;

            Send_0x0201_Success sendPacketA = new Send_0x0201_Success(14);
            sendPacketA.WriteDirectData(clientB.Client.RemoteEndPoint.ToString(), token);
            Send_0x0201_Success sendPacketB = new Send_0x0201_Success(14);
            sendPacketB.WriteDirectData(clientA.Client.RemoteEndPoint.ToString(), token);

            EasyOp.Do(() => clientA.BeginSend(sendPacketA.PackData()));
            EasyOp.Do(() => clientB.BeginSend(sendPacketB.PackData()));

            EasyOp.Do(() => clientA?.SafeClose());
            EasyOp.Do(() => clientB?.SafeClose());
        }
コード例 #4
0
        public void P2PStart_ServerTransfer(string token, string clientName, int clientPort, int p2pType)
        {
            P2PTcpItem item = null;

            if (ClientCenter.Instance.TcpMap.ContainsKey(clientName))
            {
                item = ClientCenter.Instance.TcpMap[clientName];
            }
            if (item != null && item.TcpClient.Connected)
            {
                if (item.BlackClients.Contains(m_tcpClient.ClientName))
                {
                    Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}已被加入黑名单");
                    LogUtils.Warning($"【P2P】客户端{clientName}已被加入黑名单");
                    m_tcpClient.Client.Send(sendPacket.PackData());
                }
                else if (item.AllowPorts.Any(t => t.Match(clientPort, m_tcpClient.ClientName)))
                {
                    LogUtils.Debug("【P2P】等待Tcp连接,进行绑定");
                    Send_0x0201_Success sendDPacket = new Send_0x0201_Success(token, clientPort, p2pType);
                    Send_0x0201_Success sendSPacket = new Send_0x0201_Success(token, p2pType);
                    ClientCenter.Instance.TcpMap[clientName].TcpClient.Client.Send(sendDPacket.PackData());
                    m_tcpClient.Client.Send(sendSPacket.PackData());
                }
                else
                {
                    Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"没有权限,端口{clientPort}");
                    LogUtils.Debug($"【P2P】没有权限,端口{clientPort}");
                    m_tcpClient.Client.Send(sendPacket.PackData());
                }
            }
            else
            {
                //发送客户端未在线
                LogUtils.Debug($"【P2P】客户端{clientName}不在线.");
                Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}不在线");
                m_tcpClient.Client.Send(sendPacket.PackData());
            }
        }
コード例 #5
0
        public void P2PBind_DirectConnect(string token)
        {
            P2PTcpClient clientA = ClientCenter.Instance.WaiteConnetctTcp[token];
            P2PTcpClient clientB = m_tcpClient;

            Send_0x0201_Success sendPacketA = new Send_0x0201_Success(14);

            sendPacketA.WriteDirectData(clientB.Client.RemoteEndPoint.ToString(), token);
            Send_0x0201_Success sendPacketB = new Send_0x0201_Success(14);

            sendPacketB.WriteDirectData(clientA.Client.RemoteEndPoint.ToString(), token);

            clientA.Client.Send(sendPacketA.PackData());
            clientB.Client.Send(sendPacketB.PackData());

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(5000);
                clientA.SafeClose();
                clientB.SafeClose();
            });
        }
コード例 #6
0
        public void P2PStart_ServerTransfer(string token, string clientName, int clientPort, int p2pType)
        {
            P2PTcpItem item = null;

            if (clientCenter.TcpMap.ContainsKey(clientName))
            {
                item = clientCenter.TcpMap[clientName];
            }
            if (item != null && item.TcpClient.Connected)
            {
                if (item.BlackClients.Contains(m_tcpClient.ClientName))
                {
                    Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}已被加入黑名单");
                    LogUtils.Warning($"建立隧道失败,客户端{clientName}已被加入黑名单");
                    EasyOp.Do(() => m_tcpClient.BeginSend(sendPacket.PackData()));
                }
                else if (item.AllowPorts.Any(t => t.Match(clientPort, m_tcpClient.ClientName)))
                {
                    LogUtils.Debug($"通知客户端开始建立{(p2pType >= 1 ? "打洞" : "中转")}模式隧道 token{token}");
                    Send_0x0201_Success sendDPacket = new Send_0x0201_Success(token, clientPort, p2pType);
                    Send_0x0201_Success sendSPacket = new Send_0x0201_Success(token, p2pType);
                    clientCenter.TcpMap[clientName].TcpClient.BeginSend(sendDPacket.PackData());
                    EasyOp.Do(() => m_tcpClient.BeginSend(sendSPacket.PackData()));
                }
                else
                {
                    Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"未获得授权,无法建立隧道,端口{clientPort}");
                    LogUtils.Debug($"未获得授权,无法建立隧道,端口{clientPort}");
                    EasyOp.Do(() => m_tcpClient.BeginSend(sendPacket.PackData()));
                }
            }
            else
            {
                //发送客户端未在线
                LogUtils.Debug($"【P2P】客户端{clientName}不在线.");
                Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}不在线");
                EasyOp.Do(() => m_tcpClient.BeginSend(sendPacket.PackData()));
            }
        }
コード例 #7
0
        public override bool Excute()
        {
            int step = BinaryUtils.ReadInt(m_data);

            //是否第一步创建
            if (step == 1)
            {
                //token,servername,port
                string token      = BinaryUtils.ReadString(m_data);
                string clientName = BinaryUtils.ReadString(m_data);
                int    clientPort = BinaryUtils.ReadInt(m_data);

                P2PTcpItem item = null;
                if (Global.TcpMap.ContainsKey(clientName))
                {
                    item = Global.TcpMap[clientName];
                }
                if (item != null && item.TcpClient.Connected)
                {
                    if (item.BlackClients.Contains(m_tcpClient.ClientName))
                    {
                        Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}已被加入黑名单");
                        LogUtils.Warning($"【P2P】客户端{clientName}已被加入黑名单");
                        m_tcpClient.Client.Send(sendPacket.PackData());
                    }
                    else if (item.AllowPorts.Any(t => t.Match(clientPort, m_tcpClient.ClientName)))
                    {
                        LogUtils.Debug("【P2P】等待Tcp连接,进行绑定");
                        Send_0x0201_Success sendDPacket = new Send_0x0201_Success(token, clientPort);
                        Send_0x0201_Success sendSPacket = new Send_0x0201_Success(token);
                        Global.TcpMap[clientName].TcpClient.Client.Send(sendDPacket.PackData());
                        m_tcpClient.Client.Send(sendSPacket.PackData());
                    }
                    else
                    {
                        Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"没有权限,端口{clientPort}");
                        LogUtils.Debug($"【P2P】没有权限,端口{clientPort}");
                        m_tcpClient.Client.Send(sendPacket.PackData());
                    }
                }
                else
                {
                    //发送客户端未在线
                    LogUtils.Debug($"【P2P】客户端{clientName}不在线.");
                    Send_0x0201_Failure sendPacket = new Send_0x0201_Failure($"客户端{clientName}不在线");
                    m_tcpClient.Client.Send(sendPacket.PackData());
                }
            }
            else if (step == 3)
            {
                string clientName = BinaryUtils.ReadString(m_data);
                m_tcpClient.ClientName = clientName;
                string token = BinaryUtils.ReadString(m_data);
                if (Global.WaiteConnetctTcp.ContainsKey(token))
                {
                    LogUtils.Debug($"【P2P】内网穿透成功");
                    P2PTcpClient client = Global.WaiteConnetctTcp[token];
                    Global.WaiteConnetctTcp.Remove(token);
                    client.IsAuth        = m_tcpClient.IsAuth = true;
                    client.ToClient      = m_tcpClient;
                    m_tcpClient.ToClient = client;
                    Send_0x0201_Success sendPacket = new Send_0x0201_Success();
                    client.Client.Send(sendPacket.PackData());
                    m_tcpClient.Client.Send(sendPacket.PackData());
                }
                else
                {
                    Global.WaiteConnetctTcp.Add(token, m_tcpClient);
                    LogUtils.Debug("【P2P】等待目标tcp.");
                    Global.TaskFactory.StartNew(() =>
                    {
                        Thread.Sleep(Global.P2PTimeout);
                        if (Global.WaiteConnetctTcp.ContainsKey(token))
                        {
                            LogUtils.Debug("【P2P】已超时,内网穿透失败.");
                            Global.WaiteConnetctTcp[token].Close();
                            Global.WaiteConnetctTcp.Remove(token);
                        }
                    });
                }
            }
            return(true);
        }