0

我有一个接收数据的套接字连接,并读取它进行处理。
当从套接字处理/拉取数据的速度不够快时,TCP级别就会出现瓶颈,并且接收到的数据会延迟(我可以通过解析后的tmestamps来判断)。

如何查看有多少 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);

                }
          }
     }

事实是,我猜“调度”会以某种方式阻止接收,直到它完成,最终导致延迟(即,在调度被延迟时处理的数据,因此我的(错误?)结论是数据累积在插座级别或之前。

4

3 回答 3

1

如何查看有多少 TCP 字节等待套接字读取

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

如果您预先指定字节数,并发送一个类似 的字符串"13|Hello, World!",那么当消息分两部分到达时没有问题,比如"13|Hello"", World!",因为您知道您必须读取 13 个字节。

receive()您必须在不同的调用之间保持某种状态和缓冲区。

于 2012-07-02T11:50:07.850 回答
1

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

于 2012-07-02T11:52:53.977 回答
1

当涉及到像 Wireshark 这样的外部工具时,他们无法知道套接字中还剩下多少字节。他们只知道网络接口通过了哪些数据包。使用 Wireshark 检查它的唯一方法是实际知道您从套接字读取的最后一个字节,在 Wireshark 中找到它们,然后从那里开始计数。

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

于 2012-07-02T12:03:51.990 回答