2011-10-26 3 views
0

System.Net.Sockets内のTCP/Sockets関数を使用してファイルを転送しようとしています。 しかし、ダイナミックにクライアントのバッファサイズを設定しようとすると、サーバーのサイズが4096より小さければ転送はうまくいっていますが、4096を超えるとバッファは4096の値を保持します完全には受信されません。TCP ReceiveBufferSize .Net Frameworkの最大サイズ

だから私は不思議でしたか?これは最大値ですか? 「はい」の場合は、クライアント上のループで一杯になり、サーバー上で同じ方法で受信されたバッファを使用しても安全ですか?

ありがとうございました。 (だけソケットをしようとするので、コードはかなりそのすべてではありません)一度

答えて

0

私は、ソケットと類似しており、非常に単純なファイルの受信を書いた:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    EndPoint endpoint = new IPEndPoint(IPAddress.Any, 2442); 
    socket.Bind(endpoint); 
    socket.Listen(10000); 
    System.Console.WriteLine("Waiting for incoming data on *:2442"); 
    Socket client = socket.Accept(); 

    byte[] buffer = new byte[2000]; 
    List<byte> wholeThing = new List<byte>(); 
    int count = 0; 
    do { 
    count = client.Receive(buffer); 
    for (int i = 0 ; i < count ; i++) 
     wholeThing.Add(buffer[i]); 
    System.Console.Write("*"); 
    } while (count > 0); 
    System.Console.WriteLine(Environment.NewLine + "Received {0} bytes of data", wholeThing.Count); 
    File.WriteAllBytes(Application.StartupPath + "\\receivedFile", wholeThing.ToArray()); 

は、送信者のコードはこのように見えた:

byte[] fileData = File.ReadAllBytes(fileName); 
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    socket.Connect(IPAddress.Parse(targetip), 2442); 
    int offset = 0; 
    do { 
     try { 
     offset = socket.Send(fileData, offset, fileData.Length - offset, SocketFlags.None); 
     } catch { 
     socket.Close(); 
     throw; 
     } 
    } while (offset < fileData.Length); 
+0

ありがとう=) –

0

大きなファイルを送信しようとしている場合、.netは通常、小さなチャンクに分割します。クライアント側で受け取ったデータを1つずつ再構成する必要があります。私は、networkComms.netのConnectionPacketBuilderクラス、行134 hereがあなたがしたいことを達成していると思います。データが行793の周りにどのように使用されるかはわかります。