簡體   English   中英

為什么BufferedStream.Write會拋出“此流不支持搜索操作”?

[英]Why would BufferedStream.Write throw “This stream does not support seek operations”?

這個讓我困惑。 當我甚至沒有打電話時,我收到關於尋找的錯誤?

我的代碼看起來像這樣:

// send 42
uint value = 42;
byte[] msg = BitConverter.GetBytes(value);
stream.Write(msg, 0, sizeof(uint));

我得到這個例外:

System.NotSupportedException was unhandled
Message="This stream does not support seek operations."
Source="System"
StackTrace:
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
...

stream的類型為System.IO.BufferedStream 可能會發生什么?

編輯更多信息:

在這種情況下, sizeof(uint)==msg.length
流聲明為stream = new BufferedStream(new NetworkStream(socket), 1024)

編輯:

就是這樣! 雖然可以在單個NetworkStream上進行讀寫,但在切換到BufferedStream ,必須有一個單獨的用於讀寫。 顯然,可以在同一個套接字上兩次調用NetworkStream構造函數來獲取它。

如果可以的話,我會接受Justin和Hans的答案,因為我讓我完全理解錯誤,另一個讓我找到解決方案。 感謝大家!

問題在於BufferedStream的內部工作方式(以及您在嘗試寫入之前可能已使用BufferedStream進行讀取的事實)。

當您嘗試寫入BufferedStream時,在驗證參數后,將按此順序檢查事物(所有代碼都通過Reflector從Framework中提取):


我們是在寫緩沖區的乞討嗎?

if(this._writePos == 0)

我們是否可以寫入底層流?

if(!this._s.CanWrite) // throw error

Read緩沖區是空的嗎?

if(this._readPos < this._readLen)
{
    // FlushRead() will attempt to call Seek()
    this.FlushRead();
}

如果讀緩沖區中存在未讀數據,則在寫入之前嘗試刷新。 FlushRead()調用Seek(), 這是導致錯誤的原因

您必須早先從該BufferedStream中讀取。 它從NetworkStream獲取其字節。 這些是單向的,您可以只讀取或只寫入它們,具體取決於它們的創建方式。 如果您需要更多幫助,請發布創建NetworkStream的代碼。

暫無
暫無

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

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