TLSharp/TLSharp.Core/Network/MtProtoPlainSender.cs

73 lines
2.3 KiB
C#
Raw Normal View History

2015-09-28 04:01:17 +02:00
using System;
using System.IO;
using System.Threading.Tasks;
namespace TLSharp.Core.Network
{
2016-04-18 12:50:57 +02:00
public class MtProtoPlainSender
{
2017-04-13 08:38:01 +02:00
private readonly TcpTransport _transport;
private long lastMessageId;
private readonly Random random;
2016-04-18 12:50:57 +02:00
private int sequence = 0;
private int timeOffset;
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
public MtProtoPlainSender(TcpTransport transport)
{
_transport = transport;
random = new Random();
}
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
public async Task Send(byte[] data)
{
using (var memoryStream = new MemoryStream())
{
using (var binaryWriter = new BinaryWriter(memoryStream))
{
2017-04-13 08:38:01 +02:00
binaryWriter.Write((long) 0);
2016-04-18 12:50:57 +02:00
binaryWriter.Write(GetNewMessageId());
binaryWriter.Write(data.Length);
binaryWriter.Write(data);
2015-09-28 04:01:17 +02:00
2017-04-13 08:38:01 +02:00
var packet = memoryStream.ToArray();
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
await _transport.Send(packet);
}
}
}
2015-09-28 04:01:17 +02:00
2016-07-20 09:15:28 +02:00
public async Task<byte[]> Receive()
2016-04-18 12:50:57 +02:00
{
var result = await _transport.Receieve();
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
using (var memoryStream = new MemoryStream(result.Body))
{
2017-04-13 08:38:01 +02:00
using (var binaryReader = new BinaryReader(memoryStream))
2016-04-18 12:50:57 +02:00
{
2017-04-13 08:38:01 +02:00
var authKeyid = binaryReader.ReadInt64();
var messageId = binaryReader.ReadInt64();
var messageLength = binaryReader.ReadInt32();
2015-09-28 04:01:17 +02:00
2017-04-13 08:38:01 +02:00
var response = binaryReader.ReadBytes(messageLength);
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
return response;
}
}
}
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
private long GetNewMessageId()
{
2017-04-13 08:38:01 +02:00
var time = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds);
var newMessageId = ((time / 1000 + timeOffset) << 32) |
((time % 1000) << 22) |
(random.Next(524288) << 2); // 2^19
// [ unix timestamp : 32 bit] [ milliseconds : 10 bit ] [ buffer space : 1 bit ] [ random : 19 bit ] [ msg_id type : 2 bit ] = [ msg_id : 64 bit ]
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
if (lastMessageId >= newMessageId)
newMessageId = lastMessageId + 4;
2015-09-28 04:01:17 +02:00
2016-04-18 12:50:57 +02:00
lastMessageId = newMessageId;
return newMessageId;
}
}
2017-04-13 08:38:01 +02:00
}