Пример #1
0
        private void PrimitiveReqData(TransferReqDataSchduleInfoManager reqDataSchduleInfoManager, TransferReqDataSchduleInfo currentReqDataSchduleInfo)
        {
            var endPoint = reqDataSchduleInfoManager.NotifyMessage.SrcEndPoint;
            int repeatCount = 0;
            int mtu, rto;

            while (repeatCount++ < this._config.MtuRepeatMaxCount)
            {
                mtu = TransferParaManager.GetMtu(endPoint);
                rto = TransferParaManager.GetRto(endPoint);
                var ep = currentReqDataSchduleInfo.EndPostion - currentReqDataSchduleInfo.Postion;
                if (mtu > ep)
                {
                    mtu = (int)ep;
                }

                if (mtu <= 0)
                {
                    break;
                }

                var reqMessage      = new ResourceRequestMessage(reqDataSchduleInfoManager.NotifyMessage.Header.Rid, currentReqDataSchduleInfo.Postion, mtu);
                var buffer          = reqMessage.GenerateBuffer();
                var eventHandleId   = reqMessage.ContextId;
                var eventHandleInfo = AutoEventWaitHandleManager.CreateEventWaitHandle(eventHandleId, reqDataSchduleInfoManager.NotifyMessage.Timeout);
                try
                {
                    //_ht[$"{reqMessage.Header.Rid}_{reqMessage.ContextId}"] = _watch.ElapsedMilliseconds;
                    this._net.Send(buffer, endPoint);
                    if (eventHandleInfo.EventWaitHandle.WaitOne(rto))
                    {
                        currentReqDataSchduleInfo.UpdatePostion(mtu);
                        if (currentReqDataSchduleInfo.IsTransferCompleted())
                        {
                            //Loger.Warn($"线程[{System.Threading.Thread.CurrentThread.Name}]传输[Rid:{reqDataSchduleInfoManager.NotifyMessage.Header.Rid}],[{currentReqDataSchduleInfo.BeginPostion}-{currentReqDataSchduleInfo.EndPostion}]完成");
                        }
                    }
                    else
                    {
                        TransferParaManager.RecordMtuAndRto(endPoint, mtu, rto, true);
                        mtu = TransferParaManager.AdjustDownMtu(endPoint);
                        rto = TransferParaManager.AdjustUpRto(endPoint);
                    }
                }
                finally
                {
                    AutoEventWaitHandleManager.RemoveEventWaitHandle(eventHandleId);
                    eventHandleInfo.EventWaitHandle.Dispose();
                }
            }
        }
Пример #2
0
        internal void ProResourceResponse(ResourceResponseMessage message, byte[] revData)
        {
            try
            {
                if (message.Size == ResourceResponseMessage.RESOURCE_NOT_EXIST)
                {
                    //资源不存在,发送超时,将接收数据移除
                    Loger.Warn("请求资源不存在");
                }
                else
                {
                    int mtu = message.Size + ResourceResponseMessage.HEAD_SIZE;
                    int rto = (int)(TimeEx.GetTimestamp() - message.Header.Timestamp);
                    TransferParaManager.RecordMtuAndRto(message.SrcEndPoint, mtu, rto, false);

                    ReceiveDataItem receiveDataItem;
                    if (this._revItemDic.TryGetValue(message.Header.Rid, out receiveDataItem))
                    {
                        //发送收到响应数据通知
                        EventWaitHandle eventHandle = AutoEventWaitHandleManager.GetEventWaitHandle(message.ContextId);
                        if (eventHandle != null)
                        {
                            try
                            {
                                receiveDataItem.UpdateLastAccessTimestamp();
                                if (message.Size == ResourceResponseMessage.RESOURCE_NOT_EXIST)
                                {
                                    return;
                                }

                                receiveDataItem.Write(message.Position, revData, ResourceResponseMessage.HEAD_SIZE, message.Size);
                                eventHandle.Set();
                            }
                            catch (ObjectDisposedException)
                            { }
                        }
                    }
                    else
                    {
                        //var tt = TimeEx.GetTimestamp();
                        //Loger.Warn($"未知的资源ID:{message.Header.Rid},[ContextId:{message.ContextId}],[请求响应时长:{tt - message.Header.Timestamp}],[请求数据Position:{message.Position},Size:{message.Size}],[线程:{Thread.CurrentThread.Name}]");
                    }
                }
            }
            catch (Exception ex)
            {
                Loger.Error(ex, "ProResourceResponse发生异常");
            }
        }
Пример #3
0
        private void SendTransferCompletedMessage(SendDataNotifyMessage notifyMessage)
        {
            var transferCompletedMessage = new TransferCompletedMessage(notifyMessage);
            var buffer          = transferCompletedMessage.GenerateBuffer();
            var id              = CacheKeyGenerator.GenerateWaitTransferCompletedAckMessageEventWaitHandleId(notifyMessage.Header.Rid);
            var eventHandleInfo = AutoEventWaitHandleManager.CreateEventWaitHandle(id);

            try
            {
                long beginTs = TimeEx.GetTimestamp();
                long endTs   = beginTs;

                while (!notifyMessage.IsTimeout(beginTs, endTs))
                {
                    try
                    {
                        int rto = TransferParaManager.GetRto(notifyMessage.SrcEndPoint);
                        this._net.Send(buffer, notifyMessage.SrcEndPoint);
                        if (eventHandleInfo.EventWaitHandle.WaitOne(rto))
                        {
                            break;
                        }
                        else
                        {
                            TransferParaManager.AdjustUpRto(notifyMessage.SrcEndPoint);
                        }
                    }
                    catch (SendDataException)
                    {
                        break;
                    }
                    catch (Exception ex)
                    {
                        Loger.Error(ex, "发送传输完成消息异常");
                    }

                    endTs = TimeEx.GetTimestamp();
                }
            }
            finally
            {
                AutoEventWaitHandleManager.RemoveEventWaitHandle(id);
                eventHandleInfo.EventWaitHandle.Dispose();
            }

            //注:如果一直都没有收到确认消息,则超时线程处理
        }
Пример #4
0
        public TransferReceiver(TransferConfig config, ITransferNet net, Action <ReceiveDataItem> rev)
        {
            this._config = config;
            this._net    = net;
            this._rev    = rev;
            TransferParaManager.Init(config);

            this._revOutputQueue = new AsynQueue <ReceiveDataItem>(this.RevitemOutput, "拉收到数据输出线程", true, true);

            int threadCount = config.TransferThreadCount;

            this._reqDataThreads             = new ThreadEx[threadCount];
            this._reqDataThreadsEventHandles = new AutoResetEvent[threadCount];
            for (int i = 0; i < threadCount; i++)
            {
                this._reqDataThreadsEventHandles[i] = new AutoResetEvent(false);
                this._reqDataThreads[i]             = new ThreadEx(this.ReqDataThreadMethod, $"请求数据线程[{i}]", true);
                this._reqDataThreads[i].Start(this._reqDataThreadsEventHandles[i]);
            }

            this._revTimeoutCheckThread = new ThreadEx(this.RevTimeoutCheckThreadMethod, "接收超时检测线程", true);
            this._revTimeoutCheckThread.Start();
        }