Dou*_*ugN 4 winapi ping icmp icmpsendecho2
我有一个应用程序ping一堆服务器.它运行良好的几天,但突然会有两种类型之一的许多失败:
WSA_QOS_ADMISSION_FAILURE(11010)"由于资源不足而发生QoS错误"
要么
ERROR_NOACCESS(998)"对内存位置的访问无效."
奇怪的是错误串起来了.即上述错误之一,所有ping可能会失败几分钟.然后它就清理了.之后所有的ping都会因为另一个错误而失败几分钟.它们似乎并不交错.
这种情况发生在Windows 2008 R2上.我无法随意重现它,但如果我等了一两天,它总会再次发生.
我检查并重新检查,然后再次检查以确保我关闭所有打开的手柄.
应用程序首次启动时从未发生过,因此似乎与查找或加载DLL无关.它会在一段时间后自行修复,所以似乎不会耗费资源.它运行好几天,所以它似乎不是一个API使用问题.
在这里不知所措.有没有人有任何想法?
谢谢
Yir*_*kha 10
事实证明,错误代码11010实际上不是WSA_QOS_ADMISSION_FAILURE来自WinSock(这里没有涉及),而是与IP堆栈ICMP_ECHO_REPLY结构完全不同的值,具有更有意义的含义:
IP_REQ_TIMED_OUT (11010)请求超时
您应该首先调用GetIpErrorString()并且仅" 如果函数失败,请使用FormatMessage获取返回错误的消息字符串 ".
不幸的是,这对其他价值没有帮助998.
一条线索可能是"将NT状态错误代码映射到Win32错误代码 " 这一页面,它表示在Win32代码998(ERROR_NOACCESS)中映射(或映射它在上次更新时,在2005年时)的NT状态条件更广泛:
STATUS_DATATYPE_MISALIGNMENT ERROR_NOACCESS
STATUS_ACCESS_VIOLATION ERROR_NOACCESS
STATUS_DATATYPE_MISALIGNMENT_ERROR ERROR_NOACCESS
Run Code Online (Sandbox Code Playgroud)
似乎每当IOCTL调用期间出现故障(将ICMP回应请求发送到内核以进行真正处理)时,如果可能,就会吞下底层异常,并且只返回此通用Win32代码.
因此,您可能真的将一些不完全正确的数据传递给函数(如堆栈上的未对齐缓冲区,这可能解释为什么它偶尔会发生),甚至暗示ICMP堆栈中的某些错误.我担心只有一些核心内核调试才能揭示真正的原因.
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |