📄 sender.cs
字号:
namespace Imps.Client.Core.P2P.BlockingTransportor
{
using Imps.Client.Core;
using Imps.Client.Core.P2P.FileTransportor;
using Imps.Client.Core.P2P.ICE;
using Imps.Client.Utils;
using NCindy.Session.AIO;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class Sender : TranBase
{
private const int MaxSendTimeoutCount = 0x1770;
private readonly byte[] recvBuffer;
private readonly AutoResetEvent shutdownEvent;
private ILogicSocket tranSock;
public Sender(PunchingResult result, TransportingFile file) : base(file, result)
{
this.shutdownEvent = new AutoResetEvent(false);
this.recvBuffer = new byte[FileTransportorBase.ShutdownCmdLenght];
this.Init(result.Local.FirstEndPoint);
}
private void DoAccept(object o)
{
ManualResetEvent event2 = (ManualResetEvent) o;
try
{
base.socket.Listen(10);
this.tranSock = base.socket.Accept();
}
catch (Exception exception)
{
ClientLogger.WriteGeneral("Accept failed.", exception.ToString());
}
finally
{
ClientLogger.WriteGeneral("DoAccept Exit.");
event2.Set();
}
}
private void DoSend()
{
using (FileStream stream = base.targetFile.InnerFileStream)
{
byte[] buffer = new byte[base.BufferSize];
long num = 0;
int num2 = 0;
Stopwatch stopwatch = Stopwatch.StartNew();
while (!base.stoped && (base.targetFile.CompletedSize < this.TranFileSize))
{
base.pauseEvent.WaitOne();
if (num2 > 0x1770)
{
throw new SendTimeoutException();
}
if (!base.socket.Poll(0x186a0, SelectMode.SelectWrite))
{
num2++;
}
else
{
num2 = 0;
int size = stream.Read(buffer, 0, buffer.Length);
int num4 = this.tranSock.Send(buffer, size, SocketFlags.None);
if (num4 <= 0)
{
throw new RemoteSocketClosedException();
}
base.transportedBytes += num4;
base.targetFile.CompletedSize += num4;
base.targetFile.InnerFileStream.Position = base.targetFile.CompletedSize;
long num5 = stopwatch.get_ElapsedMilliseconds();
if ((num5 - num) >= 0x3e8)
{
base.FireBlockTransported(new BlockTranEventArgs(base.targetFile.CompletedSize, this.TranFileSize, stopwatch.get_ElapsedMilliseconds()));
num = num5;
}
}
}
base.FireBlockTransported(new BlockTranEventArgs(base.targetFile.CompletedSize, this.TranFileSize, stopwatch.get_ElapsedMilliseconds()));
}
}
public override void Init(IPEndPoint ep)
{
base.Init(ep);
if (base.socket.Connected)
{
this.tranSock = base.socket;
}
else
{
ManualResetEvent state = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(this.DoAccept), state);
if (!state.WaitOne(0x7530, true))
{
try
{
base.socket.Close();
}
catch
{
}
throw new Exception("Accept UDT connection timeout.");
}
}
}
protected override void InternalTransport()
{
AsyncCallback callback = null;
try
{
if (callback == null)
{
callback = delegate (IAsyncResult recvResult) {
AsyncCallback callback = null;
try
{
if (base.socket.EndReceive(recvResult) == FileTransportorBase.ShutdownCmdLenght)
{
try
{
byte[] buffer = Encoding.UTF8.GetBytes("ShutdownOK");
if (callback == null)
{
callback = delegate (IAsyncResult sendResult) {
base.socket.EndSend(sendResult);
};
}
base.socket.BeginSend(bytes, 0, bytes.Length, SocketFlags.None, callback, null);
}
catch (Exception exception)
{
LogHelper.LogError(exception.ToString());
}
finally
{
this.shutdownEvent.Set();
}
}
}
catch (Exception exception2)
{
LogHelper.LogError(exception2.ToString());
}
};
}
this.tranSock.BeginReceive(this.recvBuffer, 0, this.recvBuffer.Length, SocketFlags.None, callback, null);
this.DoSend();
if (!base.stoped)
{
this.shutdownEvent.WaitOne();
if (base.targetFile.IsCompleted)
{
base.FireTransportCompleted();
}
}
}
catch (Exception exception)
{
base.FireTransportFailed(new TranFailedEventArgs(exception));
}
finally
{
if (this.tranSock != null)
{
try
{
this.tranSock.Close();
}
catch
{
}
}
}
}
public class SendTimeoutException : Exception
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -