簡體   English   中英

.NET,NetworkStream套接字中的TCP文件發送問題

[英]TCP File Send issue in .NET, NetworkStream Socket

我正在使用以下代碼通過tcp發送文件。

如果我連續多次發送同一文件來測試其是否健壯,則我會正確接收第一個文件,而另一個文件會弄亂。

所有混亂的文件具有相同的不正確字節,並且如果我睡眠(一會兒),所有文件都將正確傳輸。 我注意到我在讀取文件時必須實例化一個新的緩沖區,以使所有操作正確完成。 但是我不明白為什么。

我擔心重新實例化緩沖區的解決方案可能只是隱藏了另一個主要問題。 有什么建議嗎?

using(var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
    using(var binaryReader = new BinaryReader(fileStream))
    {
        var _sendingBuffer = new byte[BUFFER_SIZE];

        int length = (int)fileStream.Length;
        int bytesRead = 0;

        //Ensure we reached the end of the stream regardless of encoding
        while (binaryReader.BaseStream.Position != binaryReader.BaseStream.Length)
        {
            bytesRead = binaryReader.Read( _sendingBuffer, 0, _sendingBuffer.Length);

            _socket.BeginSend(_sendingBuffer, 0, bytesRead, SocketFlags.None, SendFileCallback, null);

            //without this i received some messed up data
            _sendingBuffer = new byte[BUFFER_SIZE];
        }    
    }
}

BeginSend是一個異步操作。 它只能保證在您調用它后才能啟動,不會立即完成。 只要套接字正在發送傳遞的數據,就不得對該數據進行更改。 操作結束將通過AsyncCallback回調參數發出信號。

您的問題恰恰是您在傳輸仍在進行時更改了傳輸緩沖區。 為每個傳輸調用創建一個新的數組可以解決此問題。

解決該問題的其他方法:

  • 使用阻塞的Socket.Send函數,該函數將阻塞直到發送完所有數據並且可以重用緩沖區為止。 這也將使您的錯誤處理更加容易,因為錯誤不會通過AsyncCallback
  • 使您的完整程序異步運行,例如使用C#5的異步任務和異步/等待功能,因此:
    1. 首先異步讀取文件的一部分。
    2. 異步讀取完成后,通過套接字異步發送
    3. 完成后,還有更多數據要讀取,請返回1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM