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