2012-07-02 87 views
0

我有一個套接字連接接收數據並讀取它進行處理。
當數據未從套接字處理/拉得足夠快時,TCP層出現瓶頸,收到的數據被延遲(我可以通過解析後的tmestamps來判斷)。測量等待被套接字讀取的TCP字節數

如何查看有多少TCP字節正在等待被套接字讀取? (通過像Wireshark的或其他一些外部工具)

private void InitiateRecv(IoContext rxContext) 
    { 
     rxContext._ipcSocket.BeginReceive(rxContext._ipcBuffer.Buffer, rxContext._ipcBuffer.WrIndex, 
      rxContext._ipcBuffer.Remaining(), 0, CompleteRecv, rxContext); 
    } 

    private void CompleteRecv(IAsyncResult ar) 
    { 
     IoContext rxContext = ar.AsyncState as IoContext; 
     if (rxContext != null) 
     { 
       int rxBytes = rxContext._ipcSocket.EndReceive(ar); 

       if (rxBytes > 0) 
       { 
        EventHandler<VfxIpcEventArgs> dispatch = EventDispatch; 
         dispatch (this, new VfxIpcEventArgs(rxContext._ipcBuffer)); 

        InitiateRecv(rxContext); 

       } 
      } 
    } 

事實是,我猜「調度」以某種方式阻止接收,直到它完成,在等待時間結束了(即,被BU處理過的數據調度延遲,因此我的(假的?)結論是,有積累的插座級或之前的數據。

回答

1

我怎麼能看到多少TCP字節正在等待由套接字讀取

通過指定一個指示h的協議很多字節都要發送。使用套接字可以在字節級別以上幾層進行操作,並且由於存在緩衝和延遲,您看不到多少個send()調用會因爲您的端口上的調用而結束。

如果指定在事先的字節數,併發送一個字符串像"13|Hello, World!",再有兩個部分郵件到達時沒有問題,說"13|Hello"", World!",因爲你知道你必須讀13個字節。

你必須在不同的調用之間保持某種狀態和緩衝區。

+0

恐怕我並沒有真正理解你的意思:目前我無法控制發送級別。我只是在聽一個由外部服務器發送的流 –

+0

@MikaJacobi然後我不明白你到底想做什麼。你在做什麼,你想解決什麼問題?你只能看到你的套接字接收了多少字節(即緩衝區中有多少字節,準備通過Receive()來呈現)。你可以使用'Socket.Available'屬性來請求這個數字。事先沒有辦法知道當前「有線」上有多少字節,或者甚至更遠,在另一端的發送緩衝區中。 – CodeCaster

+0

對不起,我對這一點很陌生。請參閱編輯。 –

1

如果您使用的是普通Socket類,則可以使用socket.Available。否則,你必須定義一個頭字節,它給出從另一端發送的字節數。

+0

嘿,那很好。它證實了我的直覺:Socket.Avail一直返回0,直到我在處理步驟中在運行時刻造成瓶頸,並且繁榮,那麼它將轉到8192.這可能意味着等待由套接字erad的數據是在門口擁擠 –

+0

@MikaJacobi它意味着沒有數據,如果你在緊密的循環中調用Avail方法,你只是在浪費時間。沒有「擠在門外」的東西。 – EJP

1

當涉及到像Wireshark這樣的外部工具時,他們無法知道套接字剩餘多少字節。他們只知道網絡接口傳遞了哪些數據包。 使用Wireshark檢查它的唯一方法是實際知道從套接字中讀取的最後一個字節,在Wireshark中找到它們並從那裏算起。

但是,獲取此信息的最佳方法是檢查.NET應用程序中套接字對象的可用屬性。