Winapi IcmpSendEcho2失败,出现WSA故障\u QOS故障\u准入故障和错误\u无准入

Winapi IcmpSendEcho2失败,出现WSA故障\u QOS故障\u准入故障和错误\u无准入,winapi,ping,icmp,icmpsendecho2,Winapi,Ping,Icmp,Icmpsendecho2,我有一个应用程序可以ping一堆服务器。它连续几天运行良好,但突然会出现以下两种故障之一: WSA_QOS_准入_失败(11010)“由于缺乏资源而发生QOS错误” 或 错误\u NOACCESS(998)“对内存位置的访问无效。” 奇怪的是错误成串出现。Ie由于上述错误之一,所有ping可能会失败几分钟。然后就放晴了。稍后,所有ping将失败几分钟,并出现另一个错误。它们似乎从未交错 这种情况发生在Windows 2008 R2上。我不能随意复制它,但如果我等一两天,它总是再次发生 我反复检查

我有一个应用程序可以ping一堆服务器。它连续几天运行良好,但突然会出现以下两种故障之一:

WSA_QOS_准入_失败(11010)“由于缺乏资源而发生QOS错误”

错误\u NOACCESS(998)“对内存位置的访问无效。”

奇怪的是错误成串出现。Ie由于上述错误之一,所有ping可能会失败几分钟。然后就放晴了。稍后,所有ping将失败几分钟,并出现另一个错误。它们似乎从未交错

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

我反复检查,然后再次检查,以确保关闭所有打开的手柄

它在应用程序首次启动时从不发生,因此似乎与查找或加载DLL无关。它会在一段时间后自行修复,所以似乎不会出现资源枯竭。而且它可以正常运行几天,所以它似乎不存在API使用问题

在这里不知所措。有人有什么想法吗


感谢事实证明,错误代码
11010
实际上不是WinSock(此处未涉及)的
WSA_QOS_准入_失败
,而是一个与IP堆栈完全不同的值,具有更具意义:

IP请求超时(11010)请求超时

您应该首先调用,并且只调用“如果函数失败,请使用FormatMessage获取返回错误的消息字符串”


不幸的是,这对另一个值,
998
没有帮助

一个线索可能是“”页,该页表示映射到Win32代码998(
ERROR\u NOACCESS
)的NT状态条件(或上次更新时映射到2005年)更广泛:

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


因此,可能是您真的在向函数传递一些不完全正确的数据(例如堆栈上未对齐的缓冲区,这可能解释了它偶尔发生的原因),或者甚至暗示ICMP堆栈中存在一些错误。我担心只有一些硬核内核调试才能揭示真正的原因。

感谢关于GetIpErrorString的提示——如果IcmpSendEcho2的文档提到这一点,那就太好了!