110,502
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 数据封包
/// </summary>
public class Message
{
private byte _class;
private byte _flag;
private int _size;
private byte[] _content;
public byte[] Content
{
get { return _content; }
set { _content = value; }
}
public int Size
{
get { return _size; }
set { _size = value; }
}
public byte Flag
{
get { return _flag; }
set { _flag = value; }
}
public byte Class
{
get { return _class; }
set { _class = value; }
}
public Message()
{
}
public Message(byte @class, byte flag, byte[] content)
{
_class = @class;
_flag = flag;
_size = content.Length;
_content = content;
}
public byte[] ToBytes()
{
byte[] _byte;
using (MemoryStream mem = new MemoryStream())
{
BinaryWriter writer = new BinaryWriter(mem);
writer.Write(_class);
writer.Write(_flag);
writer.Write(_size);
if (_size > 0)
{
writer.Write(_content);
}
_byte = mem.ToArray();
writer.Close();
}
return _byte;
}
public static Message FromBytes(byte[] Buffer)
{
Message message = new Message();
using (MemoryStream mem = new MemoryStream(Buffer))
{
BinaryReader reader = new BinaryReader(mem);
message._class = reader.ReadByte();
message._flag = reader.ReadByte();
message._size = reader.ReadInt32();
if (message._size > 0)
{
message._content = reader.ReadBytes(message._size);
}
reader.Close();
}
return message;
}
}
/// <summary>
/// 数据包写入流并校验完整性
/// </summary>
public class MessageStream
{
private byte[] _buffer;
private int _position;
private int _length;
private int _capacity;
public MessageStream()
{
_buffer = new byte[0];
_position = 0;
_length = 0;
_capacity = 0;
}
private byte ReadByte()
{
if (this._position >= this._length)
{
return 0;
}
return this._buffer[this._position++];
}
private int ReadInt()
{
int num = this._position += 4;
if (num > this._length)
{
this._position = this._length;
return -1;
}
return (((this._buffer[num - 4] | (this._buffer[num - 3] << 8)) | (this._buffer[num - 2] << 0x10)) | (this._buffer[num - 1] << 0x18));
}
private byte[] ReadBytes(int count)
{
int num = this._length - this._position;
if (num > count)
{
num = count;
}
if (num <= 0)
{
return null;
}
byte[] buffer = new byte[num];
if (num <= 8)
{
int num2 = num;
while (--num2 >= 0)
{
buffer[num2] = this._buffer[this._position + num2];
}
}
else
{
Buffer.BlockCopy(this._buffer, this._position, buffer, 0, num);
}
this._position += num;
return buffer;
}
public bool Read(out Message message)
{
message = null;
_position = 0;
if (_length > 6)
{
message = new Message();
message.Class = ReadByte();
message.Flag = ReadByte();
message.Size = ReadInt();
if (message.Size <= 0 || message.Size <= _length - _position)
{
if (message.Size > 0)
{
message.Content = ReadBytes(message.Size);
Remove(message.Size + 6);
}
else
{
Remove(-message.Size + 6);
}
return true;
}
else
{
message = null;
return false;
}
}
else
{
return false;
}
}
private void EnsureCapacity(int value)
{
if (value <= this._capacity)
return;
int num1 = value;
if (num1 < 0x100)
num1 = 0x100;
if (num1 < (this._capacity * 2))
num1 = this._capacity * 2;
byte[] buffer1 = new byte[num1];
if (this._length > 0)
Buffer.BlockCopy(this._buffer, 0, buffer1, 0, this._length);
this._buffer = buffer1;
this._capacity = num1;
}
public void Write(byte[] buffer, int offset, int count)
{
if (buffer.Length - offset < count)
{
count = buffer.Length - offset;
}
//EnsureCapacity(buffer.Length + count);
//下面正确
EnsureCapacity(_length + count);
Array.Clear(_buffer, _length, _capacity - _length);
Buffer.BlockCopy(buffer, offset, _buffer, _length, count);
_length += count;
}
private void Remove(int count)
{
if (_length >= count)
{
//Buffer.BlockCopy(_buffer, count, _buffer, 0, _length - count);
Buffer.BlockCopy(_buffer, 0, _buffer, 0, _length - count);
//Buffer.BlockCopy(_buffer, count, _buffer, 0, _length);
_length -= count;
Array.Clear(_buffer, _length, _capacity - _length);
}
else
{
_length = 0;
Array.Clear(_buffer, 0, _capacity);
}
}
}
MessageStream msgms = new MessageStream();
msgms.Write(userobject.ReceiveBuffer, 0, buffer.Length);
Message message = new Message();
while (msgms.Read(out message))
{}
//这里输出信息
var handler = new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
AppDomain.CurrentDomain.UnhandledException += handler;
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Debug.Print("{0}发生系统异常:{1}", DateTime.Now, e.ExceptionObject.ToString());
}
这样,当你在vs中调试时进程直接结束了,你可以打开 Debug->Windows->Output 窗口看看打印的信息,有详细的错误堆栈信息。当然你也可以把它输出到文本文件里观看。