110,535
社区成员
发帖
与我相关
我的任务
分享
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool isLoop = true;
Socket socketclient;
Queue<byte[]> m_packageArray = new Queue<byte[]>();
long FileLen = 0;
FileStream fs;
private void button1_Click(object sender, EventArgs e)
{
try
{
fs = new FileStream(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\Prevention.exe", FileMode.OpenOrCreate);
}
catch
{
isLoop = false;
return;
}
if (!System.Threading.ThreadPool.QueueUserWorkItem(this.DoPackage)) return;
byte[] buffReceive = new byte[1024*4];
byte[] buffer = new byte[1024*4];
int nIndex = 0;
while (isLoop)
{
//有数据到达
if (socketclient.Poll(20 * 1000, SelectMode.SelectRead))
{
int nlen = socketclient.Receive(buffReceive, nIndex, buffReceive.Length - nIndex, SocketFlags.None);
if (nlen == 0)
break;
//分析数据包
int nPackageHead = 0;
int nPackageTail = 0;
lock (buffReceive)
{
for (int i = 0; i < nlen; i++)
{
//报头
if (buffReceive[i] == (byte)60)
nPackageHead = i;
//报尾
if (buffReceive[i] == (byte)62)
{
nPackageTail = i;
//一个完整的数据包
if (nPackageTail != 0)
{
byte[] bufftemp = new byte[nPackageTail - nPackageHead + 1];
Buffer.BlockCopy(buffReceive, nPackageHead, bufftemp, 0, bufftemp.Length);
lock (m_packageArray)
{
m_packageArray.Enqueue(bufftemp);
}
nPackageHead = 0;
nPackageTail = 0;
nIndex = 0;
}
}
}
//有半包的数据
if (nPackageHead != 0 && nPackageTail == 0)
{
//将剩下的数据复制到备用缓存区
Array.Copy(buffReceive, nPackageHead, buffer, 0, buffReceive.Length - nPackageHead - 1);
Array.Clear(buffReceive, 0, buffReceive.Length);
Array.Copy(buffer, 0, buffReceive, 0, buffReceive.Length - nPackageHead - 1);
nIndex = buffReceive.Length - nPackageHead - 1;
Array.Clear(buffer, 0, buffer.Length);
}
else
{
Array.Clear(buffReceive, 0, buffReceive.Length);
}
}
}
Application.DoEvents();
}
socketclient.Shutdown(SocketShutdown.Both);
socketclient.Close();
Close();
}
private void DoPackage(object obj)
{
while (isLoop)
{
if (m_packageArray.Count > 0)
{
lock (m_packageArray)
{
for (int i = 0; i < m_packageArray.Count; i++)
{
byte[] buff = m_packageArray.Dequeue();//问题出在这里buff中怎么有这样的数据<.....><....>,正常数据应该只有一对<...>,不知道是不是我解包有误 //找文件长度
string strData = System.Text.Encoding.Default.GetString(buff, 0, 8);
if (strData == "<1FILELE")//找到文件长度包
{
strData = System.Text.Encoding.Default.GetString(buff, 0, buff.Length);
FileLen = long.Parse(strData.Substring(9, strData.Length - 10));
}
else if (buff[1] == (byte)49 && (buff[2] >= (byte)48 && buff[2] <= (byte)57))//文件类型的包
{
//去除包头,包标记等
fs.Write(buff, 8, buff.Length - 9);
}
if (FileLen > 0)
{
if (fs.Length == FileLen)
{
fs.Close();
isLoop = false;
}
}
}
}
}
System.Threading.Thread.Sleep(100);
}
}