110,533
社区成员
发帖
与我相关
我的任务
分享
MyFileStream.Position = (count - 1) * 1048576;
MyFileStream.Write(data, 0, data.Length);
MyFileStream.Flush();
/// <summary>
/// 接受
/// </summary>
/// <param name="client"></param>
/// <param name="ServerPath"></param>
public void ReceiverFile(Socket client, string ServerPath)
{
byte[] errorPacket = new byte[] { };
FileStream MyFileStream = null;
int count = 0;
string sMD5 = "";
if (File.Exists(ServerPath))
{
MyFileStream = new FileStream(ServerPath, FileMode.Open, FileAccess.ReadWrite);
string exists_file = MyFileStream.Length.ToString();//已传大小
int packetCount = (int)(Convert.ToInt64(exists_file) / 1048576);//已传包的数量
long cutFileSize = 1048576 * packetCount;
while (true)
{
byte[] index = TransferFile.ReceiveVarData(client);
byte[] bMD5 = TransferFile.ReceiveVarData(client);
byte[] data = TransferFile.ReceiveVarData(client);
string s = System.Text.Encoding.Unicode.GetString(data);
if (index.Length != 0)
{
count = Convert.ToInt32(System.Text.Encoding.Unicode.GetString(index));
}
sMD5 = System.Text.Encoding.Unicode.GetString(bMD5);
if (count * 1048576 <= cutFileSize)//验证已传文件MD5值
{
MyFileStream.Read(data, 0, data.Length);
string s1 = System.Text.Encoding.Unicode.GetString(data);
string cMD5 = GetMD5Hash(data);
if (cMD5 == sMD5)
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
MyFileStream.Seek((count - 1) * 1048576, SeekOrigin.Begin);
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
else
{
string cMD5 = GetMD5Hash(data);
if (data.Length == 0)
{
break;
}
if (cMD5 == sMD5)
{
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
}
}
else
{
MyFileStream = new FileStream(ServerPath, FileMode.Create, FileAccess.Write);
while (true)
{
byte[] index = TransferFile.ReceiveVarData(client);
byte[] bMD5 = TransferFile.ReceiveVarData(client);
byte[] data = TransferFile.ReceiveVarData(client);
sMD5 = System.Text.Encoding.Unicode.GetString(bMD5);
string cMD5 = GetMD5Hash(data);
if (data.Length == 0)
{
break;
}
if (cMD5 == sMD5)
{
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
}
MyFileStream.Close();
client.Close();
}
}
这个是接收方法的完整代码,问题是续传文件时改变了源文件,比对数据包的MD5值,不相等就替换,但是怎么都替换不了,下次比对MD5还是替换前的