2010-07-30 75 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来发送每一个字节。