Esempio n. 1
0
        private static void TransferTcp_Ip(IAsyncResult ar)
        {
            RelationTcp_Ip relation = (RelationTcp_Ip)ar.AsyncState;

            if (relation.readTcp.Connected)
            {
                int length = 0;
                EasyOp.Do(() =>
                {
                    length = relation.readTcp.GetStream().EndRead(ar);
                }, () =>
                {
                    EasyOp.Do(() =>
                    {
                        LogUtils.Trace($"接收到数据 From:{relation.readTcp.RemoteEndPoint} length:{length}");
                    });
                    if (length > 0)
                    {
                        if (relation.writeTcp.Connected)
                        {
                            EasyOp.Do(() =>
                            {
                                relation.writeTcp.GetStream().Write(relation.buffer.Take(length).ToArray(), 0, length);
                            }, () =>
                            {
                                EasyOp.Do(() =>
                                {
                                    StartTransferTcp_Ip(relation);
                                }, ex =>
                                {
                                    LogUtils.Debug($"Tcp连接已被断开,读取next数据包失败 {relation.readTcp.RemoteEndPoint}");
                                    relation.writeTcp?.SafeClose();
                                });
                            }, ex =>
                            {
                                LogUtils.Debug($"Tcp连接已被断开,发送数据包失败 {relation.writeTcp.RemoteEndPoint}");
                                relation.readTcp?.SafeClose();
                            });
                        }
                    }
                    else
                    {
                        LogUtils.Debug($"Tcp连接已被断开,接收tcp断开信号 {relation.readTcp.RemoteEndPoint}");
                        relation.writeTcp?.SafeClose();
                    }
                }, ex =>
                {
                    LogUtils.Debug($"数据包读取发生异常 {relation.readTcp.RemoteEndPoint} {ex}");
                    relation.writeTcp?.SafeClose();
                });
            }
            else
            {
                LogUtils.Debug($"Tcp连接已被断开 {relation.readTcp.RemoteEndPoint}");
                relation.writeTcp?.SafeClose();
            }
            //TcpCenter.Instance.ConnectedTcpList.Remove(relation.readTcp);
            //TcpCenter.Instance.ConnectedTcpList.Remove(relation.writeTcp);
        }
        public static bool BindTcp(P2PTcpClient readTcp, P2PTcpClient toTcp)
        {
            //TcpCenter.Instance.ConnectedTcpList.Add(readTcp);
            //TcpCenter.Instance.ConnectedTcpList.Add(toTcp);
            bool           ret        = true;
            RelationTcp_Ip toRelation = new RelationTcp_Ip();

            EasyOp.Do(() =>
            {
                toRelation.readTcp  = readTcp;
                toRelation.readSs   = readTcp.GetStream();
                toRelation.writeTcp = toTcp;
                toRelation.writeSs  = toTcp.GetStream();
                toRelation.buffer   = new byte[P2PGlobal.P2PSocketBufferSize];
                StartTransferTcp_Ip(toRelation);
            },
                      () =>
            {
                EasyOp.Do(() =>
                {
                    RelationTcp_Ip fromRelation = new RelationTcp_Ip();
                    fromRelation.readTcp        = toRelation.writeTcp;
                    fromRelation.readSs         = toRelation.writeSs;
                    fromRelation.writeTcp       = toRelation.readTcp;
                    fromRelation.writeSs        = toRelation.readSs;
                    fromRelation.buffer         = new byte[P2PGlobal.P2PSocketBufferSize];
                    StartTransferTcp_Ip(fromRelation);
                },
                          ex =>
                {
                    LogUtils.Debug($"绑定Tcp失败:{Environment.NewLine}{ex}");
                    EasyOp.Do(readTcp.SafeClose);
                    ret = false;
                });
            },
                      ex =>
            {
                LogUtils.Debug($"绑定Tcp失败:{Environment.NewLine}{ex}");
                EasyOp.Do(readTcp.SafeClose);
                EasyOp.Do(toTcp.SafeClose);
                ret = false;
            });
            return(ret);
        }
 private static void StartTransferTcp_Ip(RelationTcp_Ip tcp)
 {
     tcp.readTcp.GetStream().BeginRead(tcp.buffer, 0, tcp.buffer.Length, TransferTcp_Ip, tcp);
 }