2012-03-04 8 views
0

내 전송 파일 응용 프로그램에 문제가 있습니다. 모든 것이 멋지며 작동해야하는 방식으로 작동하지만 보낸 파일의 일부가 손상되었음을 발견했습니다.
비디오 파일 (.MP4)을 보낼 때처럼 성공적으로 전송되었지만 스냅 사진의 일부 프레임이 손상되었습니다. 원본 MP4 파일을 재생 했으므로 그림이 너무 완벽 해 보이지 않았습니다. 그 스냅 사진에.
그래서 여기에 내 코드가있다. 나는 이제 fs.Seek을 사용하는 것에 대해 혼란 스럽다. 누군가 새로운 파일을 소스 파일과 동일하게 만들지 않는다고 나에게 말했다. 내가 소켓 TCP를 사용하고보낸 파일의 데이터가 손상되었습니다. TCP 소켓 .. 어떻게 수정합니까?

.. (닷넷 4.0)

enter image description here

전송 방식 (클라이언트) :

FileStream fs; 
long sum; 
long fileSize; 
byte[] data = null; 
NetworkStream network; 
const int packetSize = 1024*8; 

private void SendFile(string srcPath, string destPath) 
    { 
     string dest = Path.Combine(destPath, Path.GetFileName(srcPath)); 
     using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read)) 
     { 
      try 
      { 
       sum = 0; 
       int count = 0; 
       data = new byte[packetSize]; 
       //send the destination path and the file size to SERVER. 
       SendCommand("receive<" + dest + "<" + fs.Length.ToString()); 
       while (sum < fileSize) 
       { 
        if (fileSize - sum < packetSize) 
        { 
         count = fs.Read(data, 0, Convert.ToInt32(fileSize - sum)); 
         network.Write(data, 0, Convert.ToInt32(fileSize - sum)); 
        } 
        else 
        { 
         count = fs.Read(data, 0, data.Length); 
         network.Write(data, 0, data.Length); 
        } 
        fs.Seek(sum, SeekOrigin.Begin); 
        sum += count; 
        backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize)); 
       } 
       network.Flush(); 
      } 
      finally 
      { 
       fs.Dispose(); 
       data = null; 
      } 
     } 
    } 

는 방법 (서버)를 수신 :

FileStream fs; 
long sum; 
long fileSize; 
byte[] data = null; 
NetworkStream network; 
const int packetSize = 1024*8; 

public void Receive(string destPath, long fileSize) 
    { 
     using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write)) 
     { 
      try 
      { 
       int count = 0; 
       long sum = 0; 
       data = new byte[packetSize]; 
       while (sum < fileSize) 
       { 
        if (fileSize - sum < packetSize) 
        { 
         count = network.Read(data, 0, Convert.ToInt32(fileSize - sum)); 
         fs.Write(data, 0, Convert.ToInt32(fileSize - sum)); 
        } 
        else 
        { 
         count = network.Read(data, 0, data.Length); 
         fs.Write(data, 0, data.Length); 
        } 
        fs.Seek(sum, SeekOrigin.Begin); 
        sum += count; 
       } 
      } 
      finally 
      { 
       fs.Dispose(); 
       data = null; 
      } 
     } 
    } 
+0

왜 당신은'fs '를 찾고 있습니까? 다음 읽기를 위해 올바른 위치에 있어야합니다. –

+0

그것은 SEEK ..와는 작동하지 않았습니다. 나는 그 라인을 제거하려고했습니다. –

답변

1

을 읽고 당신이 그것을 해결되지 않았다 Receive

count = network.Read(data, 0, data.Length); 
fs.Write(data, 0, data.Length); 

의 코드에서 샘플을 어떻게 확신 할 수있다 지금까지이 코드를 제안합니다. 안에 넣으십시오 (sum < fileSize).

보내기 :

count = fs.Read(data, 0, packetSize); 
    network.Write(data, 0, count); 
    sum += count; 
    backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize)); 

및 수신이 :

count = network.Read(data, 0, packetSize); 
    fs.Write(data, 0, count); 
    sum += count; 

이것은 당신이 읽고 바로 데이터를 전송하는 것을 보장합니다. 일 경우 이 필요하지 않습니다. Read는 읽은 바이트 수를 반환하므로 파일의 시작 부분이나 끝 부분에 문제가 없으므로 Read는 모든 정보를 읽어 매개 변수로 제공하도록 제한합니다 .

+0

감사합니다. 그 사람은 GREATTTTTT –

3

파일 또는 네트워크 스트림에서 읽는 바이트 수는 절대로 고려하지 않습니다. 서버 변수 (클라이언트 코드 &)를 참조하십시오.

입력 스트림에서 읽은 후에 count 바이트를 다른 스트림에 써야합니다. 여기에 편집

는 경우 data.Length 바이트

+0

ummm 그리고 왜 그렇게해야합니까? –

+2

'stream.Read (buffer, 0,1000)'이 스트림에서 1000 바이트를 얻는다는 것을 의미하지는 않습니다. 0 & 1000 사이의 값이 될 수 있습니다.이 때문에 Read는 읽은 바이트 수를 반환합니다. –

+0

음 .. 정확히 편집해야하는 이유를 알지 못해서 내 코드를 편집하고 답변을 게시 하시겠습니까? –