IcmpSendEcho2因WSA_QOS_ADMISSION_FAILURE和ERROR_NOACCESS失败而失败

时间:2014-04-29 20:32:52

标签: winapi ping icmp icmpsendecho2

我有一个应用程序可以ping一堆服务器。它运行好几天,但突然会有两种类型中的一种失败:

WSA_QOS_ADMISSION_FAILURE(11010)"由于缺乏资源而发生QoS错误"

ERROR_NOACCESS(998)"对内存位置的访问无效。"

奇怪的是错误串起来了。即上述错误之一,所有ping可能会失败几分钟。然后它就清理了。之后所有的ping都会因为另一个错误而失败几分钟。他们似乎永远不会交错。

这种情况发生在Windows 2008 R2上。我无法随意复制它,但如果我等了一两天,它总会再次发生。

我检查并重新检查,然后再次检查以确保关闭所有已打开的手柄。

应用程序首次启动时从未发生过,因此似乎与查找或加载DLL无关。它会在一段时间后自行修复,因此似乎没有资源耗尽。它运行好几天,所以它似乎不是一个API使用问题。

在这里不知所措。有没有人有任何想法?

由于

1 个答案:

答案 0 :(得分:9)

事实证明,错误代码11010实际上不是来自WinSock的WSA_QOS_ADMISSION_FAILURE(这里没有涉及),而是与IP堆栈的ICMP_ECHO_REPLY structure完全不同的值。有意义的意思:

  

IP_REQ_TIMED_OUT (11010)请求超时

你应该先调用GetIpErrorString()而不是“如果函数失败,请使用FormatMessage获取返回错误的消息字符串”。


不幸的是,这对其他值998没有帮助。

一个线索可能是页面“Mapping NT Status Error Codes to Win32 Error Codes”,它表示在Win32代码998(ERROR_NOACCESS)中映射(或在上次更新时映射到2005年时)的NT状态条件更广泛:

STATUS_DATATYPE_MISALIGNMENT            ERROR_NOACCESS
STATUS_ACCESS_VIOLATION                 ERROR_NOACCESS
STATUS_DATATYPE_MISALIGNMENT_ERROR      ERROR_NOACCESS

似乎每当IOCTL调用期间出现故障(将ICMP echo请求发送到内核以进行真正处理)时,如果可能的话,就会吞下底层异常并且只返回此通用Win32代码。

因此,您可能真的将一些不完全正确的数据传递给函数(如堆栈上的未对齐缓冲区,这可能解释了为什么偶尔会发生这种情况),甚至暗示ICMP堆栈中的某些错误。我担心只有一些核心内核调试才能揭示真正的原因。