为何我局域网用udp传送的文件都会损坏?文本文件能正常打开
如题,程序已经将文件分包传送,每包1000字节,也有序号。但是传送过去的文件都打不开,接收到的文件大小是正确的 --------------------编程问答-------------------- 文件是什么格式的 关注格式 传输字节流 接受文件后的保存方式 完毕 --------------------编程问答-------------------- 大小精确到字节了吗?是一样大?用HexWorkshop比较一下两个文件是不是一样的 --------------------编程问答-------------------- 文件格式是rar压缩文件,另外mp3格式的传过去也无法播放,txt格式的可以正常打开,其他格式没有测试,接受字节流后保存方式用的 File.WriteAllBytes --------------------编程问答-------------------- 难道和字节顺序有关系? --------------------编程问答-------------------- 精确到字节后发现少了4000的字节,怎么会少的?丢包?还是其他什么原因?
代码如下
private void Listen()
{
int port = 8889;
UdpClient listener = new UdpClient(port);
int m_intSerial = 0; //数据包顺序号
int m_intBlocks = 0; //数据分割块数
int m_intLength = 0; //数据长度
int m_intMessageLength = 0;
int diushi=0;
int place = 0;
int m_intGetCount = 0;
int m_intBlockLength = 1000;
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.0.110"), 8889);
try
{
while (true)
{
byte[] bytesF = listener.Receive(ref iep);
place = 0;
m_intSerial = BitConverter.ToInt32(bytesF, place);//获得本次包顺序号
place += 4;
m_intBlocks = BitConverter.ToInt32(bytesF, place);//获得数据总包数
place += 4;
m_intLength = BitConverter.ToInt32(bytesF, place);//获得本次包数据长度
place += 4;
m_intMessageLength = BitConverter.ToInt32(bytesF, place);//获得总数据长度
place += 4;
byte[] data = new byte[m_intMessageLength]; //申明数据的总长
Array.Copy(bytesF, 16, data, m_intBlockLength * m_intSerial, m_intLength); //复制本包数据
//m_intGetCount = m_intGetCount + 1;
Application.DoEvents();
if (m_intBlocks > 1)
{
while (true)
{
if (m_intGetCount >= m_intBlocks)
{
break;
}
byte[] bytes = listener.Receive(ref iep);
place = 0;
m_intSerial = BitConverter.ToInt32(bytes, place);
place += 4;
m_intBlocks = BitConverter.ToInt32(bytes, place);
place += 4;
m_intLength = BitConverter.ToInt32(bytes, place);
place += 4;
m_intMessageLength = BitConverter.ToInt32(bytes, place);
place += 4;
Array.Copy(bytes, 16, data, m_intBlockLength * m_intSerial, m_intLength); //复制数据
m_intGetCount = m_intGetCount + 1;
progressBar1.Value = (int)(m_intGetCount / m_intBlocks * 100);
Application.DoEvents();
// MessageBox.Show("共有数据包" + m_intBlocks + "个,得到" + m_intGetCount + "个", "收d到数据检测");
}
}
File.WriteAllBytes("E:\\1.mp3", data);
MessageBox.Show("共有数据包" + m_intBlocks + "个,得到" + m_intGetCount + "个", "收到数据检测");
if (m_intGetCount >= m_intBlocks)
{
break;
}
}
}
catch (System.Exception pe)
{
Console.WriteLine(pe.ToString());
}
} --------------------编程问答-------------------- 文件读写格式,采用二进制格式,不要用文本格式。 --------------------编程问答-------------------- 请问如何将传输过来的字节数组转换为2进制数据并写入文件 --------------------编程问答-------------------- 哪位能回答一下啊,传输非文本格式的文件就会出错,打不开,为什么啊? --------------------编程问答--------------------
估计就是这个原因 --------------------编程问答--------------------
FileStream fs=new FileStream("e:\\3.mp3",FileMode.creat,FileAccess.Write);
BinaryWriter bw=new BinaryWiter(fs);
bw.Write(data);
这样写吗?试了不行,另外我在读文件的时候 如果不传输,而直接再在本机上写出来一个文件就行,只要传输出去再接收就打不开了 --------------------编程问答-------------------- 继续求助,头都大了 --------------------编程问答-------------------- 刚刚测试,发现发送给对方的文件在对方的机器上无法打开,如果复制回来就能打开,这是为什么 --------------------编程问答-------------------- 对方机子有病毒 --------------------编程问答-------------------- 帮顶,我的也是啊,头都大了,想死的心都有啊 --------------------编程问答-------------------- 要不没发全,要不顺序不对!
--------------------编程问答-------------------- 应该是文件没发全把 --------------------编程问答-------------------- udp从来都不保证能够收到,在网络或者收发端某个机器及其繁忙时,50%消息都丢失了也不足为奇。要想基本保证能够收到消息,应该使用tcp而不是udp。
另外,在局域网里使用1M的数据块已经算是很小的了,1000个字节未免太小了吧?! --------------------编程问答-------------------- 具体bug自己慢慢找吧。 --------------------编程问答--------------------
正解
补充:.NET技术 , C#