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(); } } }
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发生异常"); } }