我发送的包是这样定义的
20bytes + 20bytes + 9804bytes = 1024bytes
其中的第一个20是文件名,第二个20是整个包的长度,9804的内容是变化的服务端收到这个包要怎么来校验,并且Receive()函数读到的不一定会有1024bytes,
try
{
byte [] OutByte = new byte[INFOLEN];
ReadFile("a.mp3", iSendPack, ref OutByte);
if(System.Text.UTF8Encoding.UTF8.GetString(OutByte).IndexOf("<EOF>") > -1)
{
break;
}
clientSoc.Send(OutByte,INFOLEN,SocketFlags.None);
this.textBox1.Text = iSendPack.ToString();
AddString(System.Text.UTF8Encoding.UTF8.GetString(OutByte));
}
catch
{
AddString("Send Fail ...");
clientSoc.Close();
Thread.Sleep(1000);
continue;
} private void ReadFile(string filename, int already, ref byte [] OutByte)
{
try
{
FileStream fs = new FileStream(filename,FileMode.Open, FileAccess.Read); 
BinaryReader rd = new BinaryReader(fs);
int outlenght = 0;
byte [] bytes = new byte[INFOLEN-40];
if((already-1)*(INFOLEN-40) < fs.Length)
{
if((already)*(INFOLEN-40)> fs.Length)
{
outlenght = (int)(fs.Length)%(INFOLEN-40);
}
else
{
outlenght = (INFOLEN-40);
}
fs.Seek((already-1)*(INFOLEN-40), SeekOrigin.Begin);
bytes = rd.ReadBytes(INFOLEN-40);
}
else
{
Array.Copy(System.Text.UTF8Encoding.UTF8.GetBytes("<EOF>"), 0 ,OutByte, 0, 5);
return ;
}
rd.Close();
fs.Close();
byte [] bytefilename = new byte[20];
Array.Copy(System.Text.UTF8Encoding.UTF8.GetBytes(filename), 0 ,OutByte, 0, filename.Length );
Array.Copy(System.Text.UTF8Encoding.UTF8.GetBytes(outlenght.ToString()), 0 ,OutByte, 20, outlenght.ToString().Length );
Array.Copy(bytes, 0 ,OutByte, 40, outlenght);
}
catch
{
AddString("读文件错误...");
}

解决方案 »

  1.   

    不够1024保存下来再读,等到等于或多于1204时就开始解读!
    不过我沉得这样编包不太科学,我会这样编
    4字节(int 型一条消息的总长度,包括文件名和内容等)+4字节(文件名长度)+文件名实际长度+4字节(内容实际长度)+内容实际长度
    这样就算多条消息都可以解到,这样封包就是解包时比较麻烦!
      

  2.   

    20bytes + 20bytes + 9804bytes = 1024bytes
    其中的第一个20是文件名,第二个20是整个包的长度,9804的内容是变化的
    ----------------------------------------------------------------------
    你的第二个20不是记住了整个包的长度吗,那你的作法可以是先判断接收的包的长度等于或大于40,就先开始解前面40个字节的包,解了后就可以得到整个包的长度,创建一个整个包长度的byte[],把这次读到的包除了前面40字节以外的字节先放到这个新建的byte[]里,接着读,读到多少请再放进去,直到读完整个包为止!
    一定要先解前面保存长度的字节先,这样才知道什么时候是读完了!