2010-07-30 3 views
1

두 대의 컴퓨터간에 데이터를 송수신하는 응용 프로그램을 개발하고 있지만 데이터를 보낼 때 문제가되는데 파일 크기는 4.56KB이지만 상대방의 데이터를 받으면 파일 크기가 줄어 듭니다 1.42 KB 데이터가 완료도 파일에 쓰기에 내 수신 바이트 크기는 1024 * 5000.i .I이 TCPbytes lose 소켓 프로그래밍

여기

을 사용하고 C#을 사용하고 있습니다 내가 먼저 다른 컴퓨터에게 데이터를 전송하고

내 코드입니다 어떤 파일을 받고 싶습니다.

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

일부 코드와 일부 세부 사항을 제공해주십시오. –

답변

3

글쎄, 코드를 입력하지 않았습니다 ...하지만 용의 수신 코드가 잘못되었습니다.

Read 호출에서 0이 반환 될 때까지 읽는 것이 좋습니다. 한 번에 모든 데이터를 가져올 것이라고 가정하지 마십시오.

편집 : 아, 그래, 당신의 수신 코드를 보면 :

int receivedBytesLen = clientSock.Receive(clientData1); 

당신이 당신이 그 하나의 호출에 필요한 모든 데이터를 수신했다고 생각 하죠? 다른 쪽 끝에서 연결이 끊어 지거나 필요한 모든 데이터를 읽을 때까지 수신 반올림해야합니다.

+0

인코딩도 확인하십시오. 크기를 반으로 줄일 수 있습니다. – NibblyPig

+0

이것은 코드없이 가장 좋은 방법이지만, ReadByte()까지 NetworkStream을 제안하지 않는 이유가 있습니까? NetworkStream.DataAvailable? –

+0

어디에서 사용합니까? –

0

UDP 소켓을 사용하고 있습니까? 그렇다면 모든 것이 잘됩니다. udp는 신뢰할 수 없습니다. 모든 단일 바이트를 보내려면 TCP를 사용하십시오.