[英]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.