Windows2003在网络方面存在两个BUG,当然——只是我认为的BUG,说不定不是BUG而是我应用的问题,留待以后确认并更正吧。
一个是WinInet无法使用InternetSetOption设置代理验证信息,这个严格来说倒应该算是IE7的BUG,但是只是2003的IE7的BUG。。。 这样就只能用HttpAddRequestHeaders设置代理验证信息了,还得自己用Base64加密一下。。。
另一个是目前2003的SOCKET存在的怪事,对套接字调用recv函数时会导致本地发送一个重置请求,使得recv返回的错误是:“您的主机中的软件放弃了一个已建立的连接。”(WSAECONNABORTED),而KB931319提供的测试版本的补丁打了之后,倒是能收数据了,但是本地套接字断开的时候返回的错误变成了“在一个非套接字上尝试了一个操作。”(WSAENOTSOCK)。唉~~到底补丁还是测试的,真是拆东墙补西墙。。
我现在也糊涂了。。WSAECONNRESET应该是远程主机发起断开请求返回的错误值,而本地发起的断开请求返回的错误值应该是WSAECONNABORTED还是其它的呢?。。。
2007年10月18日注:
根据后来查的资料,我的理解是:如果远端首先调用了包含SD_SEND参数的shutdown,那么本地就会如文档所说,recv函数能正常返回,并以字节数为零标识远端断开了连接。此时我们应当调用closesocket以完成套接字的关闭。而如果本地要断开连接,也要用同样的调用作为“礼貌的请求”,然后在收到使用WSAEventSelect注册的FD_CLOSE事件后再调用closesocket函数才是优雅关闭套接字的方法。想想我以前压根就只用closesocket。。。唉~~