2011-10-26 38 views
0

我正嘗試使用System.Net.Sockets內的TCP /套接字函數來傳輸文件。 但是,當我嘗試動態設置客戶端和服務器上的緩衝區的大小,如果大小小於4096,轉移做得很好,但如果它大於4096,緩衝區保持4096值,因此文件沒有完整收到。在.Net Framework中的TCP ReceiveBufferSize最大大小

所以,我想知道?這是最大值嗎? 如果是的話,使用一個由客戶端上的循環完成並在服務器上使用相同方法接收的緩衝區是否安全?

感謝您的幫助。

回答

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通常會將它們分成更小的塊。您需要在客戶端重新組合收到的數據。我認爲在networkComms.net的第134 here行的ConnectionPacketBuilder類可以實現你想要做的事情。你可以看到它是如何使用的,因爲數據在793行左右。