2008-10-03 45 views
3

NetworkStream.DataAvailable知道發件人的發送緩衝區是否爲空?還是隻是表明接收者的讀緩衝區是否有數據?我的假設是後者...NetworkStream.DataAvailable是否查看緩衝的數據?

具體而言,對於涉及正在進行的對話的某些套接字工作,我當前使用長度前綴,因此接收方知道當前批處理中有多少數據;不過,我已經發送了一個.patch,建議我改用NetworkStream.DataAvailable。我擔心的是,這隻會告訴我接收者的內容 - 而不是發送者最初發送的內容 - 但我不是套接字專家。

我錯了嗎?或者是長度前綴的路要走? (注意我不能直接讀取()直到流被關閉,因爲多個批處理在同一個連接上發送,而且將每個批處理視爲單獨處理是至關重要的;如果我在一個批處理中讀取太多(即使它被緩衝並丟棄),那麼對話將會中斷)。

回答

5

連接的一端不知道對方的發送緩衝區是否爲空。

DataAvailable僅指示是否有傳入數據要讀取。你可以在Read()之前使用它,但它本身並不能提供你想要的信息。它不會告訴你每批的開始和結束。

我之前編寫了來回對話,我在數據中使用了長度前綴。我所做的是編寫助手函數,它可以讀取確切的字節數(一次一個塊),而不會再有更多。

流中批量值的唯一替代方法是檢查傳入數據並識別批處理的開始和結束的某種方式。

+0

這就是我的想法;我會禮貌地拒絕.patch,然後堅持使用長度前綴。乾杯。 – 2008-10-03 19:03:03

2

如果您需要知道接收方何時接收到特定消息的所有數據,那麼您肯定需要使用長度前綴。

我通常會定義一個類似於此的結構,它會在我發送的任何二進制消息的前面出去。

struct Header 
{ 
    int packetIdentifier; 
    int protocolVersion; 
    int messageType; 
    int payloadSize; 
} 

該標識符讓您確定您是否擁有協議類型的有效消息。該版本讓你修改你的協議。消息類型是消息的類型(即:CommsOnline)。有效負載大小是消息正文的大小。

+0

謝謝;數據協議的其餘部分已經修復(這是Google的「協議緩衝區」格式的實現) - 但是有用的輸入。 – 2008-10-03 19:02:16