2016-05-18 4 views
0

私はhereと記載されている勝利ソケットアプリを持っています。これまでのところ、私はReadAllBytesメソッドを使用していて、大きなファイルからすべてをメモリに読み込んでいました。私は私の記憶を助けるチャンクで私のファイルを読む新しい方法を作った。ここで方法は次のとおりです。TCPヘッダに参加し、ソケットアプリケーションのチャンクでファイルを送信する方法

public static void ChunksToSend(string path) 
{ 
    int chunkSize = 1024; 
    byte[] chunk = new byte[chunkSize]; 

    using (FileStream fileReader = new FileStream(path, FileMode.Open, FileAccess.Read)) 
    { 
     BinaryReader binaryReader = new BinaryReader(fileReader); 
     int bytesToRead = (int)fileReader.Length; 
     do 
     { 
      chunk = binaryReader.ReadBytes(chunkSize); 
      bytesToRead -= chunkSize; 
     } while (bytesToRead > 0); 

     binaryReader.Close(); 
    } 
} 

さて、私はクライアント側のリンクから、このラインで私の新しい方法を接続する必要があります。

int bytesSent = sender.Send(result); 

それは簡単に見えますが、私は、TCPヘッダに問題があります私はファイルサイズと拡張コードを取得するために送信する必要があります。クライアント側の回線は次のとおりです。

//join arrays, file size info, TCP header 
... 
//file extension info, TCP Header 

したがって、私はチャンクの前にすべてを結合し、繰り返して送信する必要があります。質問は簡単に見えるかもしれませんが、もし私がそれを行うことができれば投稿しません。ありがとう。

UPDATE:私は、ファイルサイズ情報を送信しています最初の4バイトの場合

、私はReadAllBytesからの情報を使用していたが、今私が使用することができます。

long length = new System.IO.FileInfo(path).Length; 

答えて

0

私はこの問題を解決するために管理問題:

 public static void StartClient() 
     { 
      byte[] msg; 
      try 
      { 
       string inputFile = @"C:\TCPIP\test_big.iso"; 
       IPAddress ipAd = IPAddress.Parse("192.168.137.71"); 
       IPEndPoint remoteEP = new IPEndPoint(ipAd, 1234); 
       Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       sender.Connect(remoteEP); 

       Console.WriteLine("Client connected to {0}", sender.RemoteEndPoint.ToString()); 
       Console.WriteLine("Sending file..."); 

       //8 bytes, file lenght info, TCP Header 


       long length = new System.IO.FileInfo(inputFile).Length; 
       byte[] fileLenght = BitConverter.GetBytes(length); 

       //1 byte, file extension info, TCP Header 
       byte extension = 2; //file extension code 
       byte[] newArray = new byte[fileLenght.Length + 1]; 
       fileLenght.CopyTo(newArray, 1); 
       newArray[0] = extension; 
       fileLenght = newArray; 

       //send TCP Header 
       int bytesSent = sender.Send(fileLenght); 

       //send file in chunks 
       int chunkSize = 1024; 
       byte[] chunk = new byte[chunkSize]; 
       int SendPackage; 
       using (FileStream fileReader = new FileStream(inputFile, FileMode.Open, FileAccess.Read)) 
       { 
        BinaryReader binaryReader = new BinaryReader(fileReader); 
        int bytesToRead = (int)fileReader.Length; 
        do 
        { 
         chunk = binaryReader.ReadBytes(chunkSize); 
         bytesToRead -= chunkSize; 
         SendPackage = sender.Send(chunk); 
        } while (bytesToRead > 0); 

       binaryReader.Close(); 
       } 

       sender.Shutdown(SocketShutdown.Both); 
       sender.Close(); 

       Console.WriteLine("\nPress ENTER to continue..."); 
       Console.Read(); 

      } 
      catch (ArgumentNullException ane) 
      { 
       Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); 
      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
      } 
     } 
関連する問題