socket 10106问题解决日记

       很久没写博客了,这两天解决了一个创建套接字(SOCKET)失败,错误码为10106的问题。从事网络编程的朋友可能也遇到过类似问题,大多数都可以通过重装系统解决。这次我想分析一下10106产生的根本原因,给大家提供另外一种思路,解决类似问题。

【环境】
WIN7,64位系统

【现象】
CAD2006平台程序不能联网,其他程序没有问题

【错误原因】
创建SOCKET失败,错误码10106

【尝试方法】
1. 在A.dll(非CAD程序启动时加载)的入口函数中测试网络连接,成功!
2. 在B.dll(CAD程序启动时加载)的入口函数中测试网络连接,失败!
3. 在B.dll的入口函数中手动加载ws2_32.dll成功,mswsock.dll失败,错误码127!
4. 卸载用户电脑上的卡巴斯基,不行!
5. 卸载cad重新安装,然后使用Registry Mechanic修复注册表,问题解决!

【原因分析】
      使用MemDll加载mswsock.dll发现是修正IAT时失败了,具体原因是修正WahDestroyHandleContextTable函数地址时失败,
ws2_32.dll模块中找不到这个函数。我们知道,ws2_32.dll的5.1版本确实没有导出此函数,此函数在ws2help.dll中导出;
但是在6.1版本中(win7),ws2_32.dll导出了该函数。
      进一步调试,在B.dll的入口函数中加载ws2_32.dll成功后,根据模块句柄获取模块路径,发现 CAD2006平台程序中加载的ws2_32.dll模块路径 在cad2006目录下,而其他程序则是在system32目录下。
       令人不解的是,在cad2006目录下根本找不到ws2_32.dll文件,在整个系统中全局搜索,也只找到3个ws2_32.dll文件,都在系统目录下,并且都是6.1版本。 手工拷贝一个6.1版本的ws2_32.dll文件到cad2006目录,问题依旧。于是怀疑是CAD平台程序的运行时环境出了问题(本质上是cad的运行时环境有问题), 比如ws2_32.dll是不是真的加载成功了?获取到的ws2_32.dll的模块句柄是不是错乱了?是不是根据句柄获取模块所在目录的API错乱了等等。
        尝试从已加载的ws2_32.dll模块中获取accept等5.1版本中的接口,都可以成功,这说明ws2_32.dll确实已经加载,并且有效,只是版本不对,是5.1,而非6.1。
最后将cad卸载掉重新安装,问题解决!

你可能感兴趣的:(socket 10106问题解决日记)