我有一个应用程序可以 ping 一堆服务器。它运行了好几天,但突然会出现以下两种类型之一的许多故障:
WSA_QOS_ADMISSION_FAILURE (11010)“由于缺乏资源而发生 QoS 错误”
or
ERROR_NOACCESS (998) “对内存位置的访问无效。”
奇怪的是错误成群出现。即,所有 ping 操作可能会因上述错误之一而失败几分钟。然后一切就清楚了。随后,所有 ping 操作都会失败几分钟,并出现其他错误。他们似乎从来没有交错过。
Windows 2008 R2 上会发生这种情况。我无法随意重现它,但如果我等一两天,它总是会再次发生。
我检查并重新检查,然后再次检查以确保关闭所有打开的句柄。
当应用程序首次启动时,它永远不会发生,因此似乎与查找或加载 DLL 无关。而且它会在一段时间后自行修复,所以看起来并不是资源耗尽。而且几天来它运行得很好,所以这似乎不是 API 使用问题。
这里不知所措。有人有什么想法吗?
Thanks
原来是错误代码11010
实际上不是WSA_QOS_ADMISSION_FAILURE
来自WinSock(这里不涉及),但与IP堆栈的值完全不同ICMP_ECHO_REPLY结构具有更有意义的意义:
IP_REQ_TIMED_OUT(11010) 请求超时
你应该打电话GetIpErrorString()第一个也是唯一一个”如果函数失败,使用FormatMessage获取返回错误的消息字符串".
不幸的是,这对其他价值没有帮助,998
.
一个线索可能是页面“将 NT 状态错误代码映射到 Win32 错误代码”,它表示 NT 状态条件映射(或在 2005 年上次更新时映射)到 Win32 代码 998(ERROR_NOACCESS
) 更广泛:
STATUS_DATATYPE_MISALIGNMENT ERROR_NOACCESS
STATUS_ACCESS_VIOLATION ERROR_NOACCESS
STATUS_DATATYPE_MISALIGNMENT_ERROR ERROR_NOACCESS
似乎每当 IOCTL 调用(将 ICMP 回显请求发送到内核以进行真正处理)期间出现故障时,如果可能的话,底层异常将被吞掉,并且仅发送回此通用 Win32 代码。
因此,您可能确实向函数传递了一些不完全正确的数据(例如堆栈上未对齐的缓冲区,这可能解释了为什么它偶尔会发生),甚至暗示了 ICMP 堆栈内的某些错误。恐怕只有一些核心内核调试才能揭示真正的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)