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发生异常"); } }
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(); } //注:如果一直都没有收到确认消息,则超时线程处理 }
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(); }