private TaskCompletionSource<bool> InitConnect(EndPoint remoteEndPoint)
{
TcpClientSession underlyingSession = this.GetUnderlyingSession();
if (this.m_EndPointToBind != null)
underlyingSession.LocalEndPoint = this.m_EndPointToBind;
underlyingSession.NoDelay = this.NoDelay;
if (this.Proxy != null)
underlyingSession.Proxy = this.Proxy;
underlyingSession.Connected += new EventHandler(this.OnSessionConnected);
underlyingSession.Error += new EventHandler<ErrorEventArgs>(this.OnSessionError);
underlyingSession.Closed += new EventHandler(this.OnSessionClosed);
underlyingSession.DataReceived += new EventHandler<DataEventArgs>(this.OnSessionDataReceived);
if (this.ReceiveBufferSize > 0)
underlyingSession.ReceiveBufferSize = this.ReceiveBufferSize;
this.m_Session = (IClientSession) underlyingSession;
TaskCompletionSource<bool> completionSource = this.m_ConnectTaskSource = new TaskCompletionSource<bool>();
underlyingSession.Connect(remoteEndPoint);
return completionSource;
}
protected override DataRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
{
using (MemoryStream ms = new MemoryStream(bodyBuffer, offset, length))
{
BinaryFormatter bf = new BinaryFormatter();
Message msg = (Message) bf.Deserialize(ms);
return new DataRequestInfo(){
Key = msg.key,
message = msg
};
}
}
поэтому без доп буфера никак в некоторых моментах
по виду он еще хуже чем у меня было без суперсокета.
Я же думал это типа фреймворк и тут уже все продумано, а тут оказывается всё руками нужно прописывать, так и чем же он помогает.
Всеравно нихрена не понятно
Как это обрабатывать не понятно, нет никакой документации ни примеров, такое чувство что делали делали и забили на пол пути.
internal class PackageInfo : PackageInfo<FrameType, Frame>
{
public PackageInfo(FrameType key, Frame body) : base(key, body)
{
}
}
internal class ReceiveFilter : FixedHeaderReceiveFilter<PackageInfo>
{
public ReceiveFilter(int headerSize) : base(headerSize)
{
}
public override PackageInfo ResolvePackage(IBufferStream bufferStream)
{
//реализация получения пакета из потока
}
protected override int GetBodyLengthFromHeader(IBufferStream bufferStream, int length)
{
var frameLength = bufferStream.ReadInt32(true);
return frameLength - HeaderSize;
}
}
var client = new EasyClient<PackageInfo>();
client.Initialize(new ReceiveFilter(4));
client.NoDelay = true;
client.ReceiveBufferSize = 10240;
client.NewPackageReceived += NewPackageReceived;
var client = new EasyClient<PackageInfo>();
client.Initialize(new ReceiveFilter(4));
client.NoDelay = true;
client.ReceiveBufferSize = 10240;
client.NewPackageReceived += NewPackageReceived;
Насколько накладно создавать эти потоки
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, msg); //сериализуем и пишем в поток
<code>var arr = ms.GetBuffer();</code>
stream.Write(BitConverter.GetBytes(arr.Length),0,4);
stream.Write(arr,0,arr.Length);//Записываем сам буффер
}
var arr = ms.GetBuffer();
var arr = ms.ToArray();
Ну я не верю что не существует каких нибудь удобных библиотек, которые помогают во всем этом.
public static bool TryParse (string s, out int result);