VS c++ soap 获取WebServiece的错误记录 实质错误是errno的错误

来源:互联网 发布:linux fstable 编辑:程序博客网 时间:2024/05/17 23:37

在VS2015的开发环境,用添加web引用的方式获取webservice,第一次请求一个服务接口总是出错,然后运行了一段其他代码,再次请求这个接口就成功了。一直找原因,也没有找到。

问题出在解析服务反应头的"200 OK\r\n......."的码的转化上,获取的errorno的总是34的类型。

曾经以为是内存不足,泄露的问题,或者是这段内容解析不成功。但是单独摘出来放在新建的简单工程里面测试都通过。我后面就不得不扩大范围,后面把真个webservice的添加web引用,单独做了一个dll,让另一个简单项目调用,一直没有出错。

后面再测试一下其他内容,然后把项目中的这个功能代码去掉,专门调用dll的导出方法,再试试看是能不能成功吧。


检测出错的位置是在 atlhttp.inl的

emplate <class TSocketClass>inline typename CAtlHttpClientT<TSocketClass>::HTTP_RESPONSE_READ_STATUS CAtlHttpClientT<TSocketClass>::ReadHttpResponse() {。。。。。。// read from the socket until we have a complete set of headers.pBodyBegin = FindHeaderEnd(&pHeaderBegin);if (!pBodyBegin){if (!ReadSocket()){


。。。。。

// pBuffer better be pointing at the status code nowLPCSTR pEnd = NULL;if (*pBuffer >= '0' && *pBuffer <= '9'){// probably a good status codem_nStatus = strtol((LPSTR)pBuffer, (LPSTR*)&pEnd, 10);if (Checked::get_errno() == ERANGE)return NULL; // bad status code}


但是这里的strtol的转换的值是200,是不是会超出范围的。这让人很疑惑,是不是有内存泄露的其他问题。


后面经过几个测试:

1,将使用webservice的代码单独提出来放在一个新工程里面测试是成功的。但是使用动态库给导出这个方法,让原来的程序替换使用,结果还是出错。

2,将访问webservice的代码放在构造函数里面测试正确,放回原处就不行,于是将该方法逐个过程放置,最后在放在 一个看到_wtol的时候,突然觉察是这里出错了。


最终确认真正的错误是下面的代码

CString strSize = _T("5108983296");ULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer());

验证

CString strSize = _T("5108983296");if (Checked::get_errno() == ERANGE)return ; // bad status codeULONGLONG m_ullMirrorSize = _wtol(strSize.GetBuffer()); if (Checked::get_errno() == ERANGE)return ; // bad status code

如果想修复这个errno让程序继续下去,可以这么做

Checked::set_errno(0);if (Checked::get_errno() == ERANGE)return ; // bad status code

原创粉丝点击