2012-08-09 129 views
4

對於c#客戶端和服務器應用程序,我正在處理文件上載客戶端和服務器應用程序。在mscorlib.dll中發生類型'System.ArgumentOutOfRangeException'的第一次機會異常

我可以成功將我的文件名和文件數據從客戶端應用程序上傳到服務器。但是當我嘗試實現一個新的文本框時,允許文件上傳客戶端輸入他/她的名字,並在他/她單擊發送按鈕時將信息與文件名和文件數據一起發送。

客戶端應用程序。

/* file name and file length */ 
      byte[] fName = Encoding.UTF8.GetBytes(fileName); 
      byte[] fNameLen = BitConverter.GetBytes(fileName.Length); // length of file name 
      clientData = new byte[4 + fileName.Length];     
      System.Diagnostics.Debug.WriteLine("fName " + fName.Length); 
      System.Diagnostics.Debug.WriteLine("fNamelen " + fNameLen.Length); 
      fNameLen.CopyTo(clientData, 0); 
      fName.CopyTo(clientData, 4); 

      /* author name and author name length */ 
      byte[] aName = Encoding.UTF8.GetBytes(textBox2.Text); 
      byte[] aNameLen = BitConverter.GetBytes(textBox2.Text.Length); 
      System.Diagnostics.Debug.WriteLine("aName " + aName.Length); 
      System.Diagnostics.Debug.WriteLine("aNamelen " + aNameLen.Length); 
      authorData = new byte[9 + textBox2.Text.Length]; 
      aNameLen.CopyTo(authorData, 5); 
      aName.CopyTo(authorData, 9); 

服務器應用

/* retriving of file name */ 
       System.Diagnostics.Debug.WriteLine("Error 1"); 
       fNameLen = BitConverter.ToInt32(state.buffer, 0); 
       System.Diagnostics.Debug.WriteLine("Error 2 fNameLen " + fNameLen); 
       string Filename = Encoding.UTF8.GetString(state.buffer, 4, fNameLen); 
       System.Diagnostics.Debug.WriteLine("Error 3"); 
       System.Diagnostics.Debug.WriteLine("filename length " + fNameLen); 
       receivedPath = @"C:\testfiles\" + Filename; 
       System.Diagnostics.Debug.WriteLine("bytesREad1 " + bytesRead); 
       System.Diagnostics.Debug.WriteLine(receivedPath); 

       /* retriving of author name */ 
       aNameLen = BitConverter.ToInt32(state.buffer, 5); 
       System.Diagnostics.Debug.WriteLine("Error 4"); 
       System.Diagnostics.Debug.WriteLine("error 5"); 
       System.Diagnostics.Debug.WriteLine("author name length " + aNameLen); 
       string authorName = ASCIIEncoding.ASCII.GetString(state.buffer, 9, aNameLen); 
       System.Diagnostics.Debug.WriteLine("Error 6"); 
       System.Diagnostics.Debug.WriteLine("author name " + authorName); 
       System.Diagnostics.Debug.WriteLine("author name length " + aNameLen); 

輸出窗口並以粗體給出錯誤:

  • 錯誤1
  • 錯誤2 fNameLen 12
  • 錯誤3
  • 文件名長度12
  • bytesREad1 82
  • C:\ testfiles \ Test1122.txt
  • 錯誤4
  • 誤差5
  • 作者姓名長度829715301
  • 類型的第一次機會異常 'System.ArgumentOutOfRangeException' 發生在mscorlib.dll中

在此先感謝您。

+1

哪裏它拋出異常? – ken2k 2012-08-09 10:04:43

+0

問題可能是這行'aNameLen = BitConverter.ToInt32(state.buffer,5);'。這5個不應該在那裏。這裏正確的數字是4 +文件名的長度。 – devundef 2012-08-09 10:35:28

+0

異常拋出此行字符串authorName = ASCIIEncoding.ASCII.GetString(state.buffer,9,aNameLen); – Daryl 2012-08-09 11:23:47

回答

1

如果您使用BinaryReader/BinaryWriter,事情會更容易。

實施例:

客戶

fileContents是一個字節數組。

var stream = new MemoryStream(); 
var writer = new BinaryWriter(stream); 
writer.Write(fileName); 
writer.Write(authorName); 
writer.Write(fileContents.Length); 
writer.Write(fileContents); 

var data = stream.ToArray(); // send this data array to server 
writer.Dispose(); 
stream.Dispose(); 

服務器

var stream = new MemoryStream(state.buffer); 
var reader = new BinaryReader(stream); 

var fileName = reader.ReadString(); 
var author = reader.ReadString(); 
var fileContents = reader.ReadBytes(reader.ReadInt32()); 
reader.Dispose(); 
stream.Dispose(); 
相關問題