コード例 #1
0
        private void ProResourceRequest(ResourceRequestMessage message)
        {
            TransferSender sender;

            if (this._senderDic.TryGetValue(message.Header.Rid, out sender))
            {
                sender.ProResourceRequest(message);
            }
            else
            {
                //Loger.Warn($"未知的资源ID:{message.Header.Rid}");
            }
        }
コード例 #2
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();
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// 创建
        /// </summary>
        /// <param name="req"></param>
        /// <param name="data"></param>
        public ResourceResponseMessage(ResourceRequestMessage req, byte[] data)
            : base(new CommonHeader(TransferCommands.ResourceResponse, req.Header.Timestamp, req.Header.Rid))
        {
            this.ContextId = req.ContextId;
            this.Position  = req.Position;
            if (data != null)
            {
                this.Size = data.Length;
            }
            else
            {
                this.Size = RESOURCE_NOT_EXIST;
            }

            this._data = data;
        }
コード例 #4
0
        internal void ProResourceRequest(ResourceRequestMessage req)
        {
            try
            {
                this._resoucesInfo.UpdateLastAccessTimestamp();
                if (req.Size <= 0)
                {
                    Loger.Warn($"[RID:{req.Header.Rid}]请求数据长度值:{req.Size}无效,忽略");
                    return;
                }

                //Loger.Trace($"收到请求RID:{message.Rid},ContextId:{message.ContextId},Position:{message.Position}-Size:{message.Size}");
                byte[] data   = this.GetRequestData(req);
                var    res    = new ResourceResponseMessage(req, data);
                byte[] buffer = res.GenerateBuffer();
                this._net.Send(buffer, this._resoucesInfo.Policy.RemoteEP);
                //Loger.Trace($"响应请求RID:{req.Rid},ContextId:{req.ContextId},Position:{req.Position}-Size:{req.Size}");
            }
            catch (Exception ex)
            {
                Loger.Error(ex, "处理资源请求异常");
            }
        }
コード例 #5
0
        private byte[] GetRequestData(ResourceRequestMessage req)
        {
            //Loger.Trace($"收到请求RID:{message.Rid},ContextId:{message.ContextId},Position:{message.Position}-Size:{message.Size}");
            byte[]    data         = null;
            const int timeout      = 10;
            var       resoucesType = this._resoucesInfo.ResoucesType;

            while (!this._isDisposabled)
            {
                try
                {
                    switch (resoucesType)
                    {
                    case TransferDataType.Data:
                    case TransferDataType.File:
                        Stream stream = null;
                        data = new byte[req.Size];
                        try
                        {
                            if (!this._streams.TryTake(out stream, timeout, this._cts.Token))
                            {
                                lock (this._isDisposabledLock)
                                {
                                    if (this._isDisposabled)
                                    {
                                        return(null);
                                    }

                                    if (resoucesType == TransferDataType.Data)
                                    {
                                        stream = new MemoryStream(this._resoucesInfo.Data);
                                    }
                                    else if (resoucesType == TransferDataType.File)
                                    {
                                        stream = new FileStream(this._resoucesInfo.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                                    }
                                    else
                                    {
                                        throw new NotImplementedException($"未实现的发送模式[{resoucesType.ToString()}]");
                                    }

                                    this._streamList.Add(stream);
                                }
                            }

                            if (stream == null)
                            {
                                continue;
                            }

                            stream.Seek(req.Position, SeekOrigin.Begin);
                            stream.Read(data, 0, data.Length);
                        }
                        catch (ObjectDisposedException)
                        { }
                        finally
                        {
                            if (stream != null)
                            {
                                try
                                {
                                    this._streams.Add(stream);
                                }
                                catch (ObjectDisposedException)
                                { }
                            }
                        }
                        break;

                    case TransferDataType.Stream:
                        data = this._resoucesInfo.GetStreamData(req.Position, req.Size);
                        break;

                    default:
                        throw new NotImplementedException($"未实现的资源类型:{this._resoucesInfo.ResoucesType.ToString()}");
                    }

                    break;
                }
                catch (ArgumentNullException)
                {
                    //.net BUG
                    continue;
                }
                catch (OperationCanceledException)
                {
                    data = null;
                    break;
                }
                catch (Exception ex)
                {
                    Loger.Error(ex);
                    data = null;
                    break;
                }
            }

            return(data);
        }