Kilatif, интересно твои боты на других языках фрагментацию игровых пакетов тоже не учитывали? при малых размерах пакетов client.Receive будет читать весь пакет, но вот пакеты большего размера из за потоковой сути TCP будут разбиваться на порции и в момент вызова client.Receive могут быть ещё не полностью приняты компом, и client.Receive при этом считает только то количество которое было уже принято, эта функция не ждёт пока в буфере окажется столько байт сколько ты указал считать, считывается столько сколько пришло.
Я в аналоге пакетхака который пишу на шарпе с TCP соединением работаю как с потоком и в асинхронном режиме:
cpp Код:
public abstract class AbstractIOLayer
{
public Action onClose;
public Action<BinaryReader, int> onData;
protected ProxyConnection owner;
public AbstractIOLayer(ProxyConnection owner) { this.owner = owner; }
public abstract void SendData(byte[] buf, int offset, int len);
public abstract void Close();
public abstract bool Actived { get; }
public abstract void BeginRead();
}
public class StreamContainer : AbstractIOLayer
{
private Stream _stream;
private const int _bufSize = 30000;
private readonly byte[] _buf = new byte[_bufSize];
private BinaryReader _reader;
private bool _needRead; // true if need call BeginReceive in OnRecieve
private bool _opened = true;
public override bool Actived { get { return _opened; } }
public StreamContainer(Stream stream, ProxyConnection owner) : base(owner)
{
_reader = new BinaryReader(new MemoryStream(_buf));
_stream = stream;
}
public override void SendData(byte[] buf, int offset, int len)
{
if (_opened) _stream.Write(buf, offset, len);
}
public override void Close()
{
if (_opened)
{
_opened = false;
_stream.Close();
if (onClose != null) onClose();
}
}
public override void BeginRead()
{
_needRead = false; // if call in any layer don't call in OnRecieve
if (_opened) _stream.BeginRead(_buf, 0, _bufSize, OnRead, null);
}
private void OnRead(IAsyncResult r)
{
if (_opened) try
{
_needRead = true;
_reader.BaseStream.Position = 0;
var l = 0;
try { l = _stream.EndRead(r); }
//catch (Exception e) { CoreLog.AddExpectedError(e, owner.GetNameWithDir(this)); }
catch { Close(); return; }
if (l > 0 && onData != null)
{
onData(_reader, l);
if (_needRead) BeginRead();
}
else Close();
}
catch (Exception e) { CoreLog.AddError(e, owner.GetNameWithDir(this)); }
}
}
ЗЫ блин, когда же я пофикшу замену в подсветке синтаксиса символа "[" на "[ ;"...