测量等待Socket读取的TCP字节

时间:2012-07-02 11:47:12

标签: c# networking tcp

我有一个接收数据的套接字连接,并将其读取以进行处理 当数据没有从套接字处理/拉得足够快时,TCP级别存在瓶颈,并且接收的数据被延迟(解析后我可以通过tmestamp来判断)。

如何查看套接字正在等待读取多少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);

                }
          }
     }

事实是,我认为“发送”在某种程度上阻止了接收,直到它完成,结束了延迟(即,在发送延迟时处理的数据,因此我的(假?)结论有在套接字级别或之前累积的数据。

3 个答案:

答案 0 :(得分:1)

  

如何查看套接字正在等待读取的TCP字节数

通过指定一个协议来指示它要发送的字节数。使用套接字可以在字节级别之上运行几层,但由于缓冲和延迟,您无法看到有多少send()次呼叫最终作为receive()呼叫结束。

如果你预先指定了字节数,并发送了一个像"13|Hello, World!"这样的字符串,那么当消息分成两部分时就没有问题,比如"13|Hello"", World!",因为你知道你必须阅读13个字节。

您必须在不同receive()次来电之间保留某种状态和缓冲区。

答案 1 :(得分:1)

如果您使用普通socket.Available课程,则可以使用Socket。否则,您必须定义一个头字节,该字节给出从另一端发送的字节数。

答案 2 :(得分:1)

对于像Wireshark这样的外部工具,他们无法知道套接字中剩余的字节数。它们只知道网络接口传递了哪些数据包。 使用Wireshark检查它的唯一方法是实际知道从套接字读取的最后一个字节,在Wireshark中找到它们,并从那里开始计数。

但是,获取此信息的最佳方法是检查.NET应用程序中套接字对象的Available属性。