Linux netstat显示发送和接收队列大小。
我如何得到Windows下的这个信息,特别是Server 2003?
(这是一个大脑转储)
从查看netstat源代码的几个版本,似乎您正在查找的信息直接从内核(/ proc / net / …)中查询,而不是通过与Windows等价的与套接字相关的调用查询。 如果你真的有这个决心,我会看看它是如何在netstat中检索,看看你能find什么提供了相同的东西。
您应该查看ndis.com (networking驱动程序接口规范)和PCAUSA.com获取驱动程序级别的信息,因为这很可能是您在Windows上检索此信息的最佳位置。
我不相信getsockopt()或Winsock的大部分舞台会让你有用,但是如果你想朝这个方向看看MSDN的Winsock信息,还可以看看Winsock Programmer的FAQ 。
对于入站,您可以使用FIONREAD从ioctlsocket()函数获取一些有用的信息,以获取套接字的可读数据量; 您可能无法跨进程获取此数据,并且根据数据types,如果有多个项目排队,则可能只返回第一个数据块的信息,而不是整个队列。
在这种情况下,你可能会对“积压”做一些挖掘,但是我所看到的大部分内容似乎与设置处理SYN洪水的最大大小有关,而不是真正看到实际积压有多大。
如果你真的确定了,那么你也许可以用自己的分层服务提供商做一些事情,但这是一条充满危险的奇怪而又丑陋的道路,我会build议远离它。
更新:多了一点点后,我一定认为你应该看看NDIS的OIDs查询。 查找与您最相关的信息将留在您与MSDN和TechNet之间的练习中。
这个问题很老,但我想添加一些信息。 在Google上这是一个相当高的search结果。
据我所知,没有办法做到这一点,但如果任何人都可以做更多的挖掘,找出一个有效的替代品,将不胜感激!
正如@Fencepost在他的回答中指出的那样,您可以尝试查询NDIS OID。 我find的最相关的NDIS OID是OID_GEN_TRANSMIT_QUEUE_LENGTH
大多数NDIS OID都映射到WMI类,您可以使用powershell列出它们
Get-WmiObject -Namespace root\wmi -List | Where-Object {$_.name -Match "MSNdis" } | Sort-Object
但似乎没有一个传输队列长度。
@Chris J提到了Network Interface \ Output Queue Length。 你可以通过typeperf在命令行上得到这个值。
typeperf "\Network Interface(*)\Output Queue Length" -sc 1
但值总是0: http : //support.microsoft.com/kb/822226
Windows只在NIC驱动程序软件中跟踪这些信息,并且它只是每个NIC排队的数据包,并且不区分每个插槽排队的内容。
如果你想在命令行上进行networkingdebugging,你可以使用typeperf或者logman查询在perfmon中find的任何计数器。
你想要的可能是WinSock API函数调用getsockopt
:
SO_RCVBUF
为接收保留的每个套接字缓冲区的总空间。 这与SO_MAX_MSG_SIZE
无关,不一定对应于TCP接收窗口的大小。
SO_SNDBUF
为发送保留的每个套接字缓冲区的总空间。 这与SO_MAX_MSG_SIZE
无关,不一定对应于TCP发送窗口的大小。
问题是,可以要求你知道的句柄。 从外部查询似乎是困难的,看看sysinternals TcpView工具。 马克Russinovich真的是一个裂缝,甚至他不提供信息在他的工具。 我很肯定他会添加一个列,如果他有一个意思是很容易得到的价值…
我猜一些内核驱动程序可以帮助深入系统,但没有find任何可用的工具。 大小可以设置在每个sockets上,这样全局值就没有意义了…
我能find的最接近的是性能计数器Network Interface\Output Queue Length
。 这不是每个连接 – 只有每个接口,只覆盖出站队列(显然,它的名字)。
现在,每个sockets的窗口大小不同! 每个接口的设置仅表示默认值。
我知道无法查看每个套接字的窗口大小。 在Solaris中,可以看到“netstat”。
看看这里: http : //support.microsoft.com/kb/224829 。