Показать сообщение отдельно
Старый 06.02.2012, 10:50   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

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&#91;] 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&#91;] _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&#91;] 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)); }         }     }
ЗЫ блин, когда же я пофикшу замену в подсветке синтаксиса символа "[" на "&#91 ;"...
__________________
Я здесь практически не появляюсь!, Skype - ikskor

Последний раз редактировалось xkor, 06.02.2012 в 10:56.
xkor вне форума   Ответить с цитированием