我有一个接收数据的套接字连接,并将其读取以进行处理 当数据没有从套接字处理/拉得足够快时,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);
}
}
}
事实是,我认为“发送”在某种程度上阻止了接收,直到它完成,结束了延迟(即,在发送延迟时处理的数据,因此我的(假?)结论有在套接字级别或之前累积的数据。
答案 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属性。