2010-07-30 74 views
1

我正在開發在兩臺計算機之間發送和接收數據的應用程序,但是當我發送數據文件大小爲4.56 kb時存在問題,但是當我在另一側接收數據時文件大小減少1.42 kb和數據寫入文件也完成了我的接收字節大小爲1024 * 5000.i正在使用C#。我是使用TCP丟失字節Socket編程

這裏是我的代碼

我正在第一發送數據告訴其他計算機我想要收到什麼文件

private void GetLoginFile() 
    { 
     Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     try 
     { 
      char[] delimiter = splitter.ToCharArray(); 
      byte[] fileName = Encoding.UTF8.GetBytes(myIP + "_GetLoginFile"); //file name 
      byte[] fileData; 
      fileData = Encoding.UTF8.GetBytes("null"); 
      //byte[] fileData = reads.ReadToEnd().to; //file 
      byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name 
      clientData = new byte[4 + fileName.Length + fileData.Length]; 

      fileNameLen.CopyTo(clientData, 0); 
      fileName.CopyTo(clientData, 4); 
      fileData.CopyTo(clientData, 4 + fileName.Length); 
      System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(serverIP); 

      IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050); 
      clientSock.Connect(ipEnd); //target machine's ip address and the port number 
      clientSock.Send(clientData); 

      byte[] clientData1 = new byte[1024 * 5000]; 
      string receivedPath = mypath + "XML\\"; 

      int receivedBytesLen = clientSock.Receive(clientData1); 

      int fileNameLen1 = BitConverter.ToInt32(clientData1, 0); 

      string fileName1 = Encoding.ASCII.GetString(clientData1, 4, fileNameLen1); 
      //string file = Encoding.UTF8.GetString(); 

      BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName1, FileMode.Append)); 
      bWrite.Write(clientData1, 4 + fileNameLen1, receivedBytesLen - 4 - fileNameLen1); 
      //clientSock.Shutdown(SocketShutdown.Send); 

      bWrite.Close(); 
      clientSock.Close(); 
     } 
     catch (Exception ex) 
     { 
      clientSock.Close(); 
      MessageBox.Show(ex.Message); 
     } 
    } 

任何人都可以幫我解決這個問題。

+1

請提供一些代碼和一些更多的細節? – 2010-07-30 14:54:44

回答

3

那麼,你沒有給出任何代碼......但我嫌疑人這是你的接收代碼,這是錯誤的。

您應該循環讀取,直到Read調用流返回0.不要以爲您會在一次調用中獲取所有數據。

編輯:是啊,看看你接收代碼:

int receivedBytesLen = clientSock.Receive(clientData1); 

是什麼讓你覺得你已經收到所有你在一個呼叫所需要的數據?您需要循環,直到另一端關閉連接,或者您已經讀取了所需的所有數據。

+0

檢查你的編碼,它可以減小一半的大小 – NibblyPig 2010-07-30 14:56:24

+0

這是一個沒有任何代碼的最好的賭注,但是有沒有一個原因,你不建議一個NetworkStream哪裏可以ReadByte()直到!NetworkStream.DataAvailable? – 2010-07-30 14:59:53

+0

我在哪裏使用它? – 2010-07-30 15:03:38

0

你使用UDP套接字嗎?如果是這樣,那麼一切都很好:udp是不可靠的。使用TCP來發送每一個字節。