您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-25 19:13 190 查看
在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 now
LPCSTR pEnd = NULL;
if (*pBuffer >= '0' && *pBuffer <= '9')
{
// probably a good status code
m_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 code
ULONGLONG 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: