private void ReceiveCalBback(IAsyncResult ar)
{
try
{
int len = m_Socket.EndReceive(ar);
if (len > 0)
{
//已经接收到数据
//把接收到的数据 写入缓冲区的尾部
m_ReceiveMS.Position = m_ReceiveMS.Length;
//把指定长度的字节 写入数据流中
m_ReceiveMS.Write(m_ReceiveBuffer, 0, len);
//判读流中包体的长度
if (m_ReceiveMS.Length > 2)
{
//进行循环 拆分数据包 粘包处理
while (true)
{
//把数据流指针放到0处
m_ReceiveMS.Position = 0;
//计算包体的长度
//ushort msgLen = m_ReceiveMS.ReadUShort();
int flag = m_ReceiveMS.ReadInt();//判断识别t头
int seq = m_ReceiveMS.ReadInt();//判断包序号
int msgLen = m_ReceiveMS.ReadInt();//识别包体长度
if (flag == Program.frm1.flag)
{
//计算总包的长度
int countMsgLen = 12 + msgLen;
//判读流中数据 是否完整
if (m_ReceiveMS.Length >= countMsgLen)
{
byte[] buffer = new byte[msgLen];
m_ReceiveMS.Position = 12;
m_ReceiveMS.Read(buffer, 0, msgLen);
//解密数据
int k = 0;
byte[] decodeBuffer = new byte[buffer.Length];
for (int i = 0; i < buffer.Length; i++)
{
decodeBuffer[i] = (byte)(buffer[i] ^ Program.frm1.keyArray[k]);
k++;
if (k == Program.frm1.keyArray.Length)
{
k = 0;
}
}
using (MMO_MemoryStream ms2 = new MMO_MemoryStream(decodeBuffer))
{
ms2.Position = 4;
int num = ms2.ReadInt();
string msg = ms2.ReadDefaultString(msgLen - 8);
DataProcessing(num, msg);
}
//检查剩余包
int remainLen = (int)m_ReceiveMS.Length - countMsgLen;
if (remainLen > 0)
{
m_ReceiveMS.Position = countMsgLen;
byte[] remainBuffer = new byte[remainLen];
m_ReceiveMS.Position = countMsgLen;
m_ReceiveMS.Read(remainBuffer, 0, remainLen);
//清空数据流
m_ReceiveMS.Position = 0;
m_ReceiveMS.SetLength(0);
//把剩余数据重新写入数据流
m_ReceiveMS.Write(remainBuffer, 0, remainBuffer.Length);
remainBuffer = null;
}
else
{
//刚好一个完整包
//清空数据流
m_ReceiveMS.Position = 0;
m_ReceiveMS.SetLength(0);
break;
}
}
else
{
//没收到完整包
break;
}
}
else
{
//没收到完整包
break;
}
}
}
// 进行下一次接收数据包
ReceiveMsg();
}
else
{
//客户端断开连接
Client.ClientMsg.SendMsg(3, JsonConvert.SerializeObject(this.ID));
if (Program.frm1.checkBox12.Checked)
Program.frm1.SyncContext.Post(Program.frm1.print, string.Format("客户端:{0}断开连接", IP));
Program.frm1.SyncContext.Post(Program.frm1.Deluser, this);
}
}
catch (Exception ex)
{
//客户端断开连接
//Client.ClientMsg.SendMsg(3, JsonConvert.SerializeObject(this.NumberID));
if (Program.frm1.checkBox12.Checked)
Program.frm1.SyncContext.Post(Program.frm1.print, string.Format("客户端:{0}断开连接,原因2{1}", IP, ex.Message));//卡客户端的连接就是在这里
Program.frm1.SyncContext.Post(Program.frm1.Deluser, this);
}
}